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

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

Basic

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

思路分析

因为反向链表每一个节点时,须要切断链表,此时就须要切口先后两个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;//一、让 next 小哥提早握住即将要切断的右边绳子的绳头
            cur.next = pre;//二、把 cur 以后的绳子切断,cur 的牵住的人从next哥换成pre妹子,此时完成左边绳子的逆序
            pre = cur;//三、善后:为了下一步继续遍历下去,须要让 pre 往前右走一步,cur 把他握住的节点移交给pre妹子
            cur = next;//四、善后:左边绳子的逆序彻底执行完毕,cur 小哥往右走一步,和 next 一块儿牵住右段绳子的绳头
            //此时 cur 收割者又准备收割下一个节点了!
        }
        return pre;//注意,pre 就至关于左边逆序好的链表头了
    }
}
复制代码

相关文章
相关标签/搜索