1. 程式人生 > >LeetCode 92. 反轉連結串列 II(Reverse Linked List II)

LeetCode 92. 反轉連結串列 II(Reverse Linked List II)

題目描述

反轉從位置 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; } };