可视化解释链接列表数据结构代码反转所需的指导?

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;设置nextb(足够简单).下一行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;它设置resulta(再次,很简单).最后,我们有所有重要的current = next;,即设置currentb.

所以在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等.