2017-10-04 26 views
-1

我想在C++的鏈表中添加一個節點。我已經開發了添加到列表末尾的代碼,這比我的大腦更容易理解。這裏是我的代碼:


如何將節點添加到鏈接列表C++的前面?我正在超越這個概念

struct ListNode 
    { 
     double value; 
     ListNode *next; 
     ListNode(double value1, ListNode *next1 = NULL) 
     { 
      value = value1; 
      next = next1; 
     }  
    }; 
    ListNode *head;     // List head pointer 


的功能添加到列表的末尾

void LinkedList::add(double number) 
{ 
    if (head == NULL) 
     head = new ListNode(number); 
    else 
    { 
     // The list is not empty 
     // Use nodePtr to traverse the list 
     ListNode *nodePtr = head; 
     while (nodePtr->next != NULL) 
      nodePtr = nodePtr->next; 

     // nodePtr->next is NULL so nodePtr points to the last node 
     // Create a new node and put it after the last node 
     nodePtr->next = new ListNode(number); 
    } 
} 

我只是有很多的麻煩包裝我的頭移動所有的指針添加到開始。

謝謝。

+3

繪製節點和鏈接和指針通常有助於集中精神。 –

+0

將新節點添加到鏈表的前端比將其添加到列表的末尾要容易得多,特別是在沒有「尾部」指針的單鏈表中。 –

回答

1

添加到開始比在更加簡便結束。

您需要將新節點的尾部設置爲當前頭部,並將頭部設置爲新節點。

head = new ListNode(number, head); 

就是這樣。

+0

謝謝,我絕對讓這更復雜。 –

3

添加到開始很簡單。不要讓事情更復雜。

ListNode * new_node = new ListNode(number); 
if (head == nullptr) 
{ 
    head = new_node; 
} 
else 
{ 
    // Make the new node point to the (old) head. 
    new_node->next = head; 

    // Make the head pointer point to the new node. 
    head = new_node; 
} 

使用鉛筆(或筆)和紙張,並繪製指針和節點,當你逐步通過這兩種情況。


案例1:空單

插入之前:

 
head --> nullptr 

插入後:

 
      +-----+ 
new_node --> | 25 | 
      +-----+ 

 
      +-----+ 
new_node --> | 25 | 
      +-----+ 
       ^ 
       | 
head -----------+ 

案例2:不空單

插入之前:

 
     +-----+ 
head --> | 36 | 
     +-----+ 

插入後:

 
      +-----+ 
new_node --> | 25 | 
      +-----+ 

 
      +-----+  +-----+ 
new_node --> | 25 | --> | 36 | 
      +-----+  +-----+ 
          ^ 
          | 
head ------------------------+ 

 
      +-----+  +-----+ 
new_node --> | 25 | --> | 36 | 
      +-----+  +-----+ 
       ^ 
       | 
head -----------+ 

每雷米的評論,上面可以簡化爲:

ListNode * new_node = new ListNode(number); 

// Make the new node point to the (old) head. 
new_node->next = head; 

// Make the head pointer point to the new node. 
head = new_node; 

或者乾脆:

// Make the new node point to the (old) head, and 
// make the head pointer point to the new node. 
head = new ListNode(number, head); 
+1

「*不要讓事情更復雜*」 - 你不需要爲nullptr檢查當前的'head',因爲無論如何你都要覆蓋它,所以就按原樣使用它:'ListNode * new_node = new ListNode(數); new_node-> next = head; head = new_node;'可以簡化爲'head = new ListNode(number,head);' –

+0

@RemyLebeau:謝謝,增加了簡化。初學者可能更容易理解原文。 –

+0

這也是一個很好的答案,我欣賞的圖像以及 –