首页 > 代码库 > Reverse Linked List II

Reverse Linked List II

题目

Reverse a linked list from position m to n. Do it in-place and in one-pass.

For example:
Given 1->2->3->4->5->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given mn satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.

方法

使用4个指针:需要reverse的开始指针以及前一个指针, 需要reverse的结束指针以及后一个指针。
为了方便使用了头结点。
    public ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode start = new ListNode(0);
        start.next = head;
        ListNode reverseStart = null;
        ListNode reverseEnd = null;
        ListNode pre = start;
        ListNode tempStart = null;
        ListNode cur = start.next;
        int i = 1;
        while(cur != null) {
            if (i == m) {
                reverseStart = cur;
            } 
            if (i == n) {
                reverseEnd = cur;
                break;
            }

            if (i < m) {
                pre = cur;
            }
            i++;
            cur = cur.next;
        }
        tempStart = cur.next;
        
        while(reverseStart != reverseEnd) {
            cur = reverseStart;
            reverseStart = reverseStart.next;
            cur.next = tempStart;
            tempStart = cur;
        }
        reverseStart.next = tempStart;
        pre.next = reverseStart;
        
        return start.next;
    }