欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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循环中:如何实现这个翻转
C语言实现单链表的翻转
代码的功能是要实现链表的反转。为了方便阐述,每个结点用①②③④⑤⑥等来标示。
在执行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。
  1. m被赋值为n(结点①),n由指向结点①变成了指向结点②,m(结点①)指向head(NULL),head接着被赋值为结点①。(①指向NULL
  2. m被赋值为n(结点②),n由指向结点②变成了指向结点③,m(结点②)指向head(结点①),head接着被赋值为结点②。(②指向①
  3. m被赋值为n(结点③),n由指向结点③变成了指向结点④,m(结点③)指向head(结点②),head接着被赋值为结点③。(③指向②
  4. m被赋值为n(结点④),n由指向结点④变成了指向结点⑤,m(结点④)指向head(结点⑤),head接着被赋值为结点④。(④指向③
  5. m被赋值为n(结点⑤),n由指向结点⑤变成了指向结点⑥(结点⑥是NULL,意味着这是最后一次循环),m(结点⑤)指向head(结点⑥),head接着被赋值为结点⑤。(⑤指向④