1. 程式人生 > >LeetCode 92 ——反轉連結串列 II

LeetCode 92 ——反轉連結串列 II

1. 題目

2. 解答

我們需要先找到第 m 個結點及其上一個結點,然後將從 m 到 n 的結點進行反轉,最後依次將 m 到 n 反轉後的結點和 n 之後的結點放入原連結串列中即可。

從前往後依次遍歷 m-1 次即可找到第 m 個結點,然後我們開始將第 m 到第 n 個結點倒序放入一個新連結串列,也即每次都在新連結串列的頭結點後面進行插入,來實現這部分子連結串列的反轉。

最後,我們將這個反轉後的子連結串列放入原連結串列,再把第 n 個結點後面的連結串列也放回到原連結串列即可。

/**
 * 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 || m == n) return head; // 先找到第 m 個結點和其前一結點 // 如果 m == 1,則沒有 m 的前一結點,需要特殊處理 ListNode *temp = head; int num = 1; ListNode *
m_last_node = NULL; while (num < m) { m_last_node = temp; temp = temp->next; num++; } ListNode *m_node = temp; // 把第 m 到 n 個結點倒序加入新連結串列中,反轉連結串列 // 即每次都在頭結點之後插入結點,類似於佇列,先進的在後面 ListNode *queue = new ListNode
(0); ListNode *reversed_node = NULL; while (num <= n) { reversed_node = temp; temp = temp->next; reversed_node->next = queue->next; queue->next = reversed_node; num++; } // 將 m 到 n 反轉後的結點放入原連結串列中 if (m != 1) m_last_node->next = queue->next; else head = queue->next; // 將 n 後面的結點放入原連結串列中 m_node->next = temp; return head; } };

獲取更多精彩,請關注「seniusen」!