思路如下
对于任何一个节点 cur
来说,记录一个前驱节点 pre
(第一个节点的前驱节点是 null
)
先用一个临时节点 tmp
记录 cur
的下一个节点,然后设置
cur.next = pre;
pre = cur;
cur = tmp;
以下是示例图
假设原始链表如下
第一个节点的反转流程如下
第二个节点的反转流程如下
最后返回 pre
节点即为反转后的节点。
代码如下
反转链表也可以用递归方法来实现
定义递归函数 ListNode reverse(ListNode cur)
,这个递归函数的含义是
反转以 cur 为头的链表,并把反转后的头节点返回。
这个递归函数的 base case 是,只有一个节点的时候,即
这种情况下,直接返回当前节点即可。
接下来是普遍情况:
当前来到 cur 节点,c,d,e 已经完成了反转。
此时 cur 需要做如下操作:把 c , d, e 反转后的头节点获取到,假设为 pre , 在上图中,pre 就是 e 节点,然后 cur 再做如下操作
cur.next.next = cur;
cur.next = null;
其中cur.next = null
非常重要,只有这样,才能防止出现环。完整代码如下