Rac*_*hel 6 algorithm linked-list data-structures
我有以下代码用于反转链表.我在while循环中感到困惑,所以如果有人可以提供它实际上是如何工作的视觉解释,那么肯定会感激.
static void Reverse (struct node** headRef)
{
struct node* result = NULL;
struct node* current = *headref;
struct node* next;
while(current != NULL)
{
next = current->next;
current->next = result;
result = current;
current = next;
}
*headRef = result;
}
Run Code Online (Sandbox Code Playgroud)
Dan*_*Tao 11
好的,这是我试图让valya的答案更清晰(尽管我认为它已经很好了):
说我们有这个清单:
// a->b->c->d->e->NULL
Run Code Online (Sandbox Code Playgroud)
我们从第一个节点开始a,它包含一个指针(next)b:
// a->b ...
Run Code Online (Sandbox Code Playgroud)
该行next = current->next;设置next为b(足够简单).下一行current->next = result;是这样的:
// NULL<-a b ... (notice there is no longer a pointer from a to b)
Run Code Online (Sandbox Code Playgroud)
然后我们有result = current;它设置result到a(再次,很简单).最后,我们有所有重要的current = next;,即设置current到b.
所以在while循环的下一次迭代中,next设置为b,result设置为a,并current设置为b,我们重新开始:
next = current->next;
// NULL<-a<-b c ...
current->next = result;
result = current;
Run Code Online (Sandbox Code Playgroud)
然后我们再做一次:
next = current->next;
// NULL<-a<-b<-c d ...
current->next = result;
result = current;
Run Code Online (Sandbox Code Playgroud)
一旦我们到达链表中的最后一项(e在此示例中),就会发生这种情况:
next = current->next; // next becomes NULL
// NULL<-a<-b<-c<-d<-e
current->next = result;
result = current; // result is now e
current = next; // current is now NULL
Run Code Online (Sandbox Code Playgroud)
现在,因为current是NULL,while循环终止,我们留下:
*headRef = result;
Run Code Online (Sandbox Code Playgroud)
正如你现在所看到的那样,它headRef指出e,e作为我们链表中的新的第一项,e->next指向d,d->next指向c等.