实现链表逆序

来源:互联网 发布:excel数据加双引号 编辑:程序博客网 时间:2024/05/18 16:55

typedef struct List{

    int data;

    struct List *next;

}List;

这是我做练习题遇到的。编写一个函数实现对已有的一个链表逆序。自己刚开始也不懂,只知道就是要改变指针的指向,但是不知道什么实现,下面的代码也gogle的,然后自己弄明白的。

首先链表之间是结点,每个结点包含数据域和指针域,结点的指针域是指向下一个结点的数据域的,也就是说它保存的是下一个数据域的地址。而链表都会有一个头结点,头结点指向的就是第一个元素的地址。这就是一般顺序情况下链表指针的指向关系。

要实现链表逆序,就是让指针的指向改变,即next指针不再指向下一个元素,而是指向上一个元素,第一个元素指向空,然后再用一个类型的指针指向最后的元素,当做头结点。

结合代码:

List *list_reverse(List *head)

{

    //思路就是改变每个节点的next指针的指向,本来每个节点的next指针指向的是下一个元素的地址,现在让它指向上一个元素的地址

    List *p,*q,*r,*head1;

    p=head;//p指向head头节点,头节点的next指针指向的是第一个元素的位置

    q=p->next;//即头节点的next指针,指向第一个元素的地址

    while(q!=NULL)

    {

        r=q->next;//保存q的下一个元素的地址,以便后面让q指向它的下一个元素

        q->next=p;//改变q->next的指向,让它指向上一个元素,

        p=q;//p指向q现在的位置

        q=r;//q指向q的下一个位置,r存的就行q的下一个元素的地址

    //每一次循环结束,都能让q->next指向它的上一个元素,而pq又移动到各自的下一个节点,进行同样的操作,直到最后q-next指向了null,而r = q->next也就空了,q = r;q也就为空了,p也移到了最后一位,循环结束,成功改变所以q->next指针,让他们指向它们的上一个元素。

    }

   // head1 = p;

    head->next =NULL;//head->next本来指向的是第一个元素,现在它作为最后一个元素,要让它指向null,否则会一直指向第一个元素

    head1 = p;//让头节点指向p,即最后一个元素的地址。

    //如果是head = p;那么这个head不是实参传来的head,是重新创建一个头节点。而且用这个同名的head之后

    // 如果是写成head = p;head->next顺序不能颠倒,不然就是把新创建的head->next指向null,不指向后面就没法输出了。

    return head1;

}

具体的解释代码后面的解释都有,自己刚开始的时候也弄不明白,以前数据结构学得不好,所以第一次看的时候就是看不懂,调试打断点什么的也还是看不明白,整个人就处于烦躁之中,觉得怎么这么难理解,晚上回去睡了一觉,第二天早上起来又开始分析,终于弄明白了(不知道是不是早上效率比较高还是人的状态比较好的原因)。现在感觉特容易,那种解决了难题之后的喜悦还是挺好的(也许这就是这行的魅力所在吧),虽然代码不是自己写的,但是理解没有注释的代码对于还在学语法的自己来说还是有点难。也许以后也会有菜鸟会遇到和我一样的情况,所以就把解释写的多点,希望能帮助以后的初学者。


0 0
原创粉丝点击