2013-11-04 78 views
0

我想弄清楚这种方法如何可以用于反转链接列表。但我不知道这里发生了什么。我需要知道它是如何将指针切换到另一个方向的。感谢帮助。链接列表反转

void reverse(struct node** head_ref) 
{ 
     Node* prev = NULL; 
     Node* current = *head_ref; 
     Node* next; 
     while (current != NULL) 
     { 
      next = current->next; 
      current->next = prev; 
      prev = current; 
      current = next; 
     } 
     *head_ref = prev; 
} 
+5

创建一个小链接列表,也许有3个元素。然后用调试器调用reverse()和单步调试,仔细注意发生的所有事情。 –

+0

@MartinJames我试图通过使用图来切换指针。但搞砸了。 – 14K

+0

翻转双向链表的重点是什么?事实上,大多数事情不应该被颠倒,因此C++的反向迭代器 – aaronman

回答

1

有没有真正的需要扭转这个名单,因为它的双链接,但这里的这个功能是如何工作的?

我们开始与元素的列表:

list: [A -> B -> C -> NULL] 
current: A 
next: UNINITIALISED 
prev: NULL 

首先,我们看看元素A.它的'下一个'指针指向B.我们将该指针指向B并将其备份到本地变量'next'中。然后我们把A的'next'指向当前的本地'previous',它现在是NULL。接下来,我们更新本地的“上一个”指针并将其设置为A,最后设置本地“当前”指针指向的“未来”,这是元素B.

list: [A -> NULL], [B -> C -> NULL] 
current: B 
next: B 
prev: A 

现在,我们已经完成了与循环的第一次迭代,所以我们回到顶部并重新进行。我们将本地'下一个'设置为B的'下一个',这是C.我们将B的'下一个'设置为当前本地'前一个',这是A.最后,我们更新本地'之前'为B并更新当地的“当前”是C.

list: [B -> A -> NULL], [C -> NULL] 
current: C 
next: C 
prev: B 

模式现在是相当明显的,所以我会跳过演练...

现在
list: [C -> B -> A -> NULL] 
current: NULL 
next: NULL 
prev: C 

,电流为NULL,所以在布尔表达式while循环返回false,我们退出循环。发生的最后一件事情是,列表中新的“头部”指针现在被设置为指向新的头部。C.