C语言实现单链表的翻转
程序员文章站
2024-01-15 12:47:16
...
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接着被赋值为结点⑤。(⑤指向④)
上一篇: 【中软国际实训】——Day9
下一篇: 【第十一周】numpy作业