2015-11-13 14 views
1

比方說,我有一個列表就像這樣:瞭解加入一個鏈接列表的前

[1]-> [2]-> [3]-> [4]-> [5]->NULL 

其中1的值是頭,5尾。 我按照這裏顯示的示例代碼:https://codereview.stackexchange.com/questions/29784/reversing-a-linked-list-and-adding-removing-nodes

我不明白的是這條線(在addtoFront功能)

ptr->value = input; 
ptr->next = head; // Point next value to the previous head 
head = ptr; 

這是我得到的。 ptr->value = input

這一行初始化稱爲指針的節點與給定值

`ptr->next = head;` 

該行設置新項的下一個指針(要在前面被插入),到前頭部,所以我們有這樣的事情:

插入[9]到前面,所以:

[9] (new head points to old head) 
[9] -> [1] (9's next pointer points to 1) 

我不明白的是這行:

head = ptr; 

讀這讓我困惑的是,我將其解釋爲設置兩個節點彼此相等,即意義[1]變爲[9]因此,我們有2個節點是[9],[9]->[9]->[2]->[3]->[4]->[5]->NULL

但這顯然不是這種情況。

一旦他們沒有箭頭符號->,我似乎完全迷失在發生的事情中(對於大多數函數)。任何幫助將非常感激!

+0

'head'總是指向第一個節點,所以當你插入一個新的第一個節點時,你必須指出這一點。 –

回答

0

這裏的問題是,您正在考慮指向具體實例的指針,而不是指向內存位置的實際指針。

在您引用的問題中,head是指向包含節點實例的內存位置的指針。

的代碼:
頭= PTR

正在更新的存儲位置,其頭部分,而頭的原始位置現在包含內ptr->下。

要獲得頭的實際節點值,則需要取消引用指針:

*head 

因此,例如,給定一個鏈表頭指向的內存位置8,其中包含與值的節點實例「一個」和一個新的輸入 'b':

執行您指向的代碼之前:

  1. 頭== 8
  2. 頭戴式>值=='a'
  3. head-> next = NULL;
  4. PTR == 12 //這是通過我挑選的任意存儲位置被從調用返回到MALLOC
  5. ptr->值== 'B'
  6. ptr->下一= NULL;

一旦代碼塊高亮顯示被執行:

  1. 頭== 12
  2. 頭戴式>值== 'B'
  3. 頭戴式>下一= 8;
  4. head-> next-> value =='a'
  5. head-> next-> next == NULL;
  6. PTR == 12
  7. ptr->值== 'B'
  8. ptr->下一= NULL;
0

假設你有一個鏈接列表,像這樣:

H   T 
[3]->[2]->[1]->NULL 

我們要插入一個元素4至前(頭部側)的節點。首先,我們需要創建一個新的節點到一邊,指向ptr

ptr  H   T 
[4]  [3]->[2]->[1]->NULL 

然後,我們需要將它鏈接到列表頭:

ptr->next = head 

ptr  H   T 
[4]---->[3]->[2]->[1]->NULL 

最後但並非最不重要的,我們需要更新頭指針以指向列表的新開始,因爲現在它將指向列表中的第二個元素而不是第一個元素。 ptr現在指向列表的新第一個元素。

head = ptr; 

ptr 
H    T 
[4]->[3]->[2]->[1]->NULL 

而且,插入完成。

0

這裏的細節:

你的指針是這樣的:

頭 - >下一步 - >下一步 - >下一步 - >尾

ptr->value = input; 

現在看起來是這樣的:

head - > next - > next - > next - > tail - > null

and

ptr - > null

所以你基本上有兩個列表在這一點上。

ptr->next = head; // Point next value to the previous head 

現在你連接你的兩個列表:

PTR - >頭 - >下一步 - >下一步 - >下一步 - >尾 - >空

head = ptr; 

現在你」重新確定你所說的head指向那個新塊,而不是舊塊。

頭(原PTR) - >未來(原頭) - >下一步 - >下一步 - >下一步 - >尾 - >空

現在你已經插入了新的價值,你的列表的前面。