ListNode詳解

一、ListNode的概念

ListNode是鏈表的基本單元,它包含了一個值和一個指向下一個節點的指針。其中,鏈表是由一系列的節點組成,每個節點都包含了當前節點的值和指向下一個節點的指針。

鏈表通常分為單向鏈表、雙向鏈表和循環鏈表等不同類型,而ListNode則是這些鏈表中最基本的節點類型。


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

二、ListNode的操作

1、創建ListNode

ListNode的創建可以通過new關鍵字動態分配內存來實現。下面代碼實現了創建一個包含3個節點的鏈表。


ListNode* createList() {
    ListNode* n1 = new ListNode(1);
    ListNode* n2 = new ListNode(2);
    ListNode* n3 = new ListNode(3);
    n1->next = n2;
    n2->next = n3;
    n3->next = NULL;
    return n1;
}

2、遍歷ListNode

遍歷ListNode需要循環處理每個節點,從頭節點開始,依次訪問每個節點的值。


void traverseList(ListNode* head) {
    ListNode* p = head;
    while(p) {
        cout<<p->val<<" ";
        p = p->next;
    }
}

3、插入節點

在ListNode中插入一個新節點,需要將新節點插入到指定位置。可以通過三個指針來實現:pre、cur、next,其中pre指向當前位置的前一個節點,cur指向當前位置,next指向當前位置的下一個節點。


void insertNode(ListNode* head, int pos, int val) {
    ListNode* p = head;
    ListNode* pre = NULL;
    for(int i=0; i<pos; i++) {
        pre = p;
        p = p->next;
    }
    ListNode* newNode = new ListNode(val);
    pre->next = newNode;
    newNode->next = p;
}

4、刪除節點

刪除ListNode中的一個節點,需要將該節點的前一個節點pre指向該節點的下一個節點next。


void deleteNode(ListNode* head, int val) {
    ListNode* p = head;
    ListNode* pre = NULL;
    while(p) {
        if(p->val == val) {
            if(pre) {
                pre->next = p->next;
            } else {
                head = p->next;
            }
            delete p;
            break;
        }
        pre = p;
        p = p->next;
    }
}

三、ListNode的應用

1、反轉鏈表

反轉一個單向鏈表可以採用三個指針,按照當前節點、前一個節點和下一個節點的順序調整,不斷向後移動,直到遍歷完整個鏈表。


ListNode* reverseList(ListNode* head) {
    ListNode* p = head;
    ListNode* pre = NULL;
    while(p) {
        ListNode* next = p->next;
        p->next = pre;
        pre = p;
        p = next;
    }
    return pre;
}

2、鏈表求和

給定兩個鏈表,每個鏈表代表一個非負整數,每個節點代表整數的一位。將這兩個整數相加,並以鏈表的形式返回結果。


ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    ListNode* dummy = new ListNode(0);
    ListNode* p = dummy;
    int sum = 0;
    while(l1 || l2 || sum) {
        if(l1) {
            sum += l1->val;
            l1 = l1->next;
        }
        if(l2) {
            sum += l2->val;
            l2 = l2->next;
        }
        p->next = new ListNode(sum % 10);
        sum /= 10;
        p = p->next;
    }
    return dummy->next;
}

3、環形鏈表

判斷給定的鏈表是否有環,並返回第一個進入環的節點。可以使用快慢指針法。慢指針每次向後移動一步,快指針每次向後移動兩步。如果鏈表存在環,則兩個指針一定會相遇,此時將其中的一個指針移回到頭節點,然後兩個指針每次向後移動一步,相遇的位置即為環的起點。


ListNode* detectCycle(ListNode *head) {
    ListNode *slow = head, *fast = head;
    while(fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast) {
            slow = head;
            while(slow != fast) {
                slow = slow->next;
                fast = fast->next;
            }
            return slow;
        }
    }
    return NULL;
}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/187765.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-28 06:26
下一篇 2024-11-28 06:26

相關推薦

  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分布式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25

發表回復

登錄後才能評論