LeetCode 92. 反轉連結串列 II(Reverse Linked List II)
阿新 • • 發佈:2018-11-05
題目描述
反轉從位置 m 到 n 的連結串列。請使用一趟掃描完成反轉。
說明:
1 ≤ m ≤ n ≤ 連結串列長度。
示例:
輸入: 1->2->3->4->5->NULL, m = 2, n = 4
輸出: 1->4->3->2->5->NULL
解題思路
建一個beforehead node,連上原連結串列的頭結點,這樣的話就算頭結點變動了,我們還可以通過beforehead->next來獲得新連結串列的頭結點。這道題的要求是隻通過一次遍歷完成,就拿題目中的例子來說,變換的是2,3,4這三個點,那麼我們可以先取出2,用front指標指向2,然後當取出3的時候,我們把3加到2的前面,把front指標前移到3,依次類推,到4後停止,這樣我們得到一個新連結串列4->3->2, front指標指向4。對於原連結串列連說,有兩個點的位置很重要,需要用指標記錄下來,分別是1和5,因為當2,3,4被取走時,原連結串列就變成了1->5->NULL,要把新連結串列插入的時候需要這兩個點的位置。1的位置很好找,因為知道m的值,我們用pre指標記錄1的位置,5的位置最後才能記錄,當4結點被取走後,5的位置需要記下來,這樣我們就可以把倒置後的那一小段連結串列加入到原連結串列中。其中最後last指標指向2, front指標指向4。
程式碼展示
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode *beforehead=(ListNode*)malloc (sizeof(ListNode));
beforehead->next=head;
ListNode *pre,*front,*last,*cur;
pre=beforehead;
for(int i=1;i<m;i++){
pre=pre->next;
}
cur=pre;
last=pre->next;
for(int i=m;i<=n;i++){
cur=pre->next;
pre-> next=cur->next;
cur->next=front;
front=cur;
}
cur=pre->next;
last->next=cur;
pre->next=front;
return beforehead->next;
}
};