leetcode 92 反转链表 II O(n)

// 从前往后遍历, 保留left前一个节点pre位置, 保留right后一个节点的位置q
// 同时保留lef所在的位置rTail, 保留right所在位置p
// 翻转left到right的链表
// 把p接到pre后面,把q接到rTail后面
// 特判pre是否为null, 此时head可能是q的位置
// 细节特别多
// 完事儿

class Solution {

    public int n;

    public ListNode reverseBetween(ListNode head, int left, int right) {
        ListNode p = head;
        left --;
        right --;
        int i = 0;
        ListNode pre = null;
        while(i < left) {
            pre = p;
            p = p.next;
            i++;
        }
        ListNode rTail = p;
        ListNode q = null;
        if (p != null)
            q = p.next;
        ListNode temp = null;
        for (; i < right; i++) {
            temp = q.next;
            q.next = p;
            p = q;
            q = temp;
        }
        rTail.next = q;
        if (pre != null)
            pre.next = p;
        else
            head = p;
        return head;
    }
}

你可能感兴趣的:(LeetCode,链表,Java,leetcode,链表)