92 reverse linked list2

https://leetcode.com/problems/reverse-linked-list-ii/

思路是记录start,end以及start左和end右,以及使用dummy head

不用dummy node主要的问题是反转之后要把segment左边界与新的segment左端相连,但是segment左边界是可能为null的,用了dummynode左边界一定不为null了

右边界是不是null其实并不太影响,我们并不会dereference右边界

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        ListNode dummy = new ListNode(-1, head);
        ListNode leftNode = dummy;
        ListNode rightNode = dummy;
        
        // preLeft和nextRight是要翻转的segment的左右边界(不包含在segment里)
        // leftNode是反转之前segment的第一个元素,也是反转之后的最后一个
        while (left > 1) {
            leftNode = leftNode.next;
            left--;
        }
        ListNode preLeft = leftNode;
        leftNode = leftNode.next;
        
        while (right >= 1) {
            rightNode = rightNode.next;
            right--;
        }
        ListNode nextRight = rightNode.next;
        
        ListNode pre = preLeft;
        ListNode cur = leftNode;
        
        while (cur != nextRight) {
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        
        preLeft.next = pre;
        leftNode.next = nextRight;
        
        return dummy.next;
    }
}

不用dummy node的话是这样的

Last updated