首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

C 與 Java 實現單鏈表核心操作對比:創建、插入、刪除

     編輯:Java 相關知識

前言

鏈表是數據結構基石。本文以單鏈表為例,對比 C 語言(指針手動管理內存)與 Java(引用自動 GC)的實現差異,幫助理解底層機制與高級語言封裝的異同。

一、 C 語言實現(手動內存管理)

1. 節點定義

typedef struct Node {
    int data;
    struct Node* next;
} Node;

2. 初始化頭節點

Node* initList() {
    Node* head = (Node*)malloc(sizeof(Node));
    if (!head) return NULL;
    head->next = NULL;
    return head;
}

3. 尾插法插入數據

void insertTail(Node* head, int data) {
    if (!head) return;
    Node* p = head;
    while (p->next) p = p->next; // 找到尾節點
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (!newNode) return;
    newNode->data = data;
    newNode->next = NULL;
    p->next = newNode;
}

4. 刪除指定值節點

void deleteNode(Node* head, int data) {
    if (!head) return;
    Node *prev = head, *curr = head->next;
    while (curr) {
        if (curr->data == data) {
            prev->next = curr->next; // 斷鏈
            free(curr);              // 釋放內存
            curr = prev->next;       // 繼續遍歷
        } else {
            prev = curr;
            curr = curr->next;
        }
    }
}

二、 Java 實現(面向對象、自動 GC)

1. 節點類

class Node {
    int data;
    Node next;
    public Node(int d) { data = d; }

    // 尾插法
    void appendToTail(int d) {
        Node end = new Node(d);
        Node n = this;
        while (n.next != null) n = n.next;
        n.next = end;
    }
}

2. 刪除節點(返回新頭節點)

Node deleteNode(Node head, int d) {
    if (head == null) return null;
    if (head.data == d) return head.next; // 刪除頭節點

    Node n = head;
    while (n.next != null) {
        if (n.next.data == d) {
            n.next = n.next.next; // 斷鏈,GC 自動回收被斷開節點
            return head;
        }
        n = n.next;
    }
    return head; // 未找到
}

三、 核心差異總結

維度C 語言Java
內存管理手動 malloc/free,易漏內存/野指針自動 GC,無需釋放
指針/引用顯式指針操作,靈活但危險引用語義,安全但間接
頭節點處理需雙指針或傳指針的指針修改頭返回新頭節點引用
代碼冗長度較長,含錯誤檢查簡潔,異常自動拋出
適用場景嵌入式、系統級、性能極致敏感應用層開發、業務邏輯為主

四、 進階思考

  • 虛擬頭節點:兩種語言均可引入 dummy head,統一刪除邏輯,避免單獨判斷頭節點。
  • 雙向鏈表:Java LinkedList 底層即雙向鏈表,C 需自行維護 prev 指針。
  • 性能基準:C 因無 GC 暫停、內存佈局緊湊,極高頻操作下有優勢;但 Java 逃逸分析、JIT 編譯後差距大幅縮小。

結語

理解 C 手動鏈表有助於掌握指針、內存佈局等底層本質;掌握 Java 封裝則能高效完成業務開發。建議初學者先用 C 寫透「增刪改查」,再轉 Java 體會語言賦能,最終查看 JDK LinkedList 源碼,融會貫通。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved