剑指Offer题目16:链表反转(Java)

191 阅读1分钟

面试题16:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

Basic

三指针向前推进法(自创词汇方便记忆)

思路分析

由于反向链表每个节点时,需要切断链表,此时就需要切口前后两个Node holder: pre 和 next

可以想象成一根绳子切成两段,分别需要两个人来牵住绳头

左边绳子需要牵住右端(逆序)

右边绳子只需有人保住后面那段链表即可,因此右边绳子牵住左端。

如果不找这两个人来牵住各自两边的绳头,切断后的两段链表就会丢失,只要没有Holder,就被回收

同时需要从前往后遍历下去,需要多一个移动指针 Node cur 收割者,从头结点head开始收割

代码实现

public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head == null) {
            return null;
        }
        if(head.next == null) {
            return head;
        }
        ListNode pre = null;
        ListNode next = null;
        ListNode cur = head;
        while(cur != null) {
            next = cur.next;//1、让 next 小哥提前握住即将要切断的右边绳子的绳头
            cur.next = pre;//2、把 cur 之后的绳子切断,cur 的牵住的人从next哥换成pre妹子,此时完成左边绳子的逆序
            pre = cur;//3、善后:为了下一步继续遍历下去,需要让 pre 往前右走一步,cur 把他握住的节点移交给pre妹子
            cur = next;//4、善后:左边绳子的逆序完全执行完毕,cur 小哥往右走一步,和 next 一起牵住右段绳子的绳头
            //此时 cur 收割者又准备收割下一个节点了!
        }
        return pre;//注意,pre 就相当于左边逆序好的链表头了
    }
}