Leetcode:92. 反轉連結串列 II
阿新 • • 發佈:2018-12-19
反轉從位置 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趟掃描)。
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; } }; |