LeetCode 92 ——反轉連結串列 II
阿新 • • 發佈:2018-11-19
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」!