头插法巧解任意链表区间反转

题目链接:https://leetcode.cn/problems/reverse-linked-list-ii/description/?envType=study-plan-v2&envId=top-interview-150
头插法巧解任意链表区间反转_第1张图片

头节点插入法,设置一个虚拟节点,不断循环到要反转的前面一个位置,哪怕是1也能包含进去。接着反转,需要记录一开始的节点,这是反转后最后的一个节点,要指向反转完后的一个节点。中间直接头插法即可。

class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        //设置头节点,连到整个链表前面,这样子可以将left=1的情况囊括进去
        //dummyNode不应该动
        ListNode dummyNode = new ListNode(0,head);
        ListNode pre = dummyNode;
        for(int i = 1;i <= left-1;i++)
            pre = pre.next;
        //目前已经到了要翻的第一个节点的前面一个节点,开始翻转
        //从3开始翻转,2自己会跑到最后
        ListNode p = pre.next.next;
        //记录翻转过后的最后一个节点
        ListNode end = pre.next;
        for(int i = 1;i <= right-left;i++){
            end.next = p.next;
            ListNode temp = pre.next;
            pre.next = p;
            p = p.next;
            pre.next.next = temp;
        }
        return dummyNode.next;
    }
}

你可能感兴趣的:(算法,算法,leetcode)