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的话是这样的

/**
 * 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) {
        int cnt = 1;
        ListNode pre = null;
        ListNode cur = head;
        
        while (cnt < left) {
            pre = cur;
            cur = cur.next;
            cnt++;
        }
        
        ListNode start = pre;
        ListNode startNext = cur;
        while (cnt <= right) {
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
            cnt++;
        }
        ListNode end = cur;
        if (start != null) {
            start.next = pre;
        } else {
            head = pre;
        }
        startNext.next = end;
        return head;
    }
}

Last updated