C语言实现单链表的翻转

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。
  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接着被赋值为结点⑤。(⑤指向④



猜你喜欢

转载自blog.csdn.net/qq_28081081/article/details/80665628