链表逆置
==前言==
链表逆置是初学时有困扰到我的难点.
由于链表头结点可放可不放数据,所以写代码时候 ->next 用的云里雾里。
这里讲解头结点与第一结点区分的情况,即头结点你把它看作这个 链表的“文件名” 就行。
若头结点为L,则第一结点为L->next。
==代码==
1 | void listReverse(linkedList &L) |
看不懂别慌。我会把代码拆解成三块为你讲解。
讲解前,先做一个理解工作,以 L->next 为例,按在表达式左边or右边分,存在两种情况:
情况一(左):L->next = NULL;
重点在next,即L的指针域,该表达式将指针域指向NULL。
情况二(右):p = L->next;
重点在 L->next 整体, 即 L->next 这个结点,->next在这里就是个形式,目的还是为了告诉你是这个结点!该表达式将p指针指向结点L->next。
==讲解==
我们先看第一轮循环做了什么:
建议阅读顺序:黑色(初始)、蓝色(操作)、红色(理解)

第二轮:
建议阅读顺序:黑色(初始)、蓝色(操作)、红色(理解)

第三轮省略(可以自己尝试)。
==总结==
不难发现:
链表逆置利用了s、p两个指针的移动实现
每一轮循环体执行结束后,s指向刚刚逆置成功的结点,p指向下一轮待逆置的结点
为什么需要p?
因为2.2步骤中s->next会被改写,
若只有s,会丢失剩余的结点,
这时候p起到暂存的作用,等待下一轮2.1步骤中的s=p找到它。
最后给一份带注释的代码~
1 | void listReverse(linkedList &L) |
有问题可以评论区交流讨论哈~