1. 程式人生 > >【LeetCode】92. 反轉連結串列 II 結題報告 (C++)

【LeetCode】92. 反轉連結串列 II 結題報告 (C++)

題目描述:

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

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

示例:

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

解題方案:

本題解法的一個亮點是使用dummy作為頭指標,最後函式返回dummy->next就行了。不知道為啥要叫dummy,dummy有笨蛋的意思。。。連結串列型別的題目思路大致還是一樣的,沒有很大的區別,注意多使用幾個指標就好了。本題解法,有點像是連結串列結點頭插法加入隊中。。

/**
 * 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) {
         if (head == NULL || head->next == NULL) {
            return head;
        }
        
        ListNode* dummy = new ListNode(0);
        dummy->next = head;
        
        ListNode* prev = dummy;
        for (int i = 0; i < m - 1; i++) {
            prev = prev->next;
        }
        ListNode* start = prev->next;
        ListNode* then = start->next;
        
        for (int i = 0; i < n - m; i++) {
            start->next = then->next;
            then->next = prev->next;
            prev->next = then;
            then = start->next;
        }
        
        return dummy->next;
    }
};