typedef struct node_s{ int item; struct node_s* next; }node_t; node_t* reverse_list(node_t* head) { node_t* n=head; head=NULL; while(n){ node_t* m=m; n=n->next; m-next=head; head=m; } return head; }这个算法的主要思想就是集中在这个while循环中:如何实现这个翻转
代码的功能是要实现链表的反转。为了方便阐述,每个结点用①②③④⑤⑥等来标示。
在执行while(n)循环之前,有两句代码:
node_t* n = head;
head=NULL;
这两行代码的中:第一句的作用是用一个
临时变量n来保存结点①,第二句是把head修改为NULL。
然后就开始遍历了,我们看到while循环里的那四句代码:
node_t* m=m; n=n->next; m-next=head; head=m;
先看前两句,用m来保存n,然后让n指向n的下一个结点,之所以复制 n 给 m ,是因为 n 的作用其实是
控制while循环次数 的作用,每循环一次它就要被修改为指向下一个结点。
再看后两句,变量head在这里像是一个临时变量,后两句让 m 指向了 head,然后 head 等于 m。
实际演示一遍,在while循环之前,n指向①,Head(起一个临时变量的作用)被修改为NULL。
- m被赋值为n(结点①),n由指向结点①变成了指向结点②,m(结点①)指向head(NULL),head接着被赋值为结点①。(①指向NULL)
- m被赋值为n(结点②),n由指向结点②变成了指向结点③,m(结点②)指向head(结点①),head接着被赋值为结点②。(②指向①)
- m被赋值为n(结点③),n由指向结点③变成了指向结点④,m(结点③)指向head(结点②),head接着被赋值为结点③。(③指向②)
- m被赋值为n(结点④),n由指向结点④变成了指向结点⑤,m(结点④)指向head(结点⑤),head接着被赋值为结点④。(④指向③)
- m被赋值为n(结点⑤),n由指向结点⑤变成了指向结点⑥(结点⑥是NULL,意味着这是最后一次循环),m(结点⑤)指向head(结点⑥),head接着被赋值为结点⑤。(⑤指向④)