1. 程式人生 > >Leetcode:92. 反轉連結串列 II

Leetcode:92. 反轉連結串列 II

反轉從位置 m 到 n 的連結串列。請使用一趟掃描完成反轉。

說明: 1 ≤ m ≤ n ≤ 連結串列長度。

示例:

輸入: 1->2->3->4->5->NULL, m = 2, n = 4
輸出: 1->4->3->2->5->NULL

解題思路:

1.方便起見建立一個新的結點head1指向初始的表頭。

2.*p從head1開始,往後移動m-1個位置。(題目中明確1 ≤ m ≤ n ≤ 連結串列長度,不必考慮溢位問題)

3.新建結點head2作為表頭,將p結點之後的m-n+1個元素依次插入head2之後。

4. 將得到的新連結串列插入原來的表中。

注意,步驟1-4只用了額外的兩個結點空間,僅掃描一次(嚴格來說大部分都不需要一次,只有完全反轉連結串列時才有1趟掃描)。

C++程式碼
class Solution { public:     ListNode* reverseBetween(ListNode* head, int m, int n) {         if (head == NULL || head->next == NULL) return head;         ListNode* head1 = new ListNode(0);         head1->next = head;         ListNode* p = head1;         //將p後移m-1個單位         int sgn = n - m + 1;         while (m - 1) {             p = p->next;             m--;         }         ListNode* q = p->next, *last = q;         //將之後的sgn個元素插入head2的表頭         ListNode* head2 = new ListNode(0),*temp;         while (sgn) {             temp = q->next;             q->next = head2->next;             head2->next = q;             q = temp;             p->next = temp;             sgn--;         }         temp = p->next;         p->next = head2->next;         last->next = temp;         return head1->next;     } };