1. 程式人生 > >【LeetCode】25. k個一組翻轉連結串列 結題報告 (C++)

【LeetCode】25. k個一組翻轉連結串列 結題報告 (C++)

題目描述:

給出一個連結串列,每 個節點一組進行翻轉,並返回翻轉後的連結串列。

是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 的整數倍,那麼將最後剩餘節點保持原有順序。

示例 :

給定這個連結串列:1->2->3->4->5

當 = 2 時,應當返回: 2->1->4->3->5

當 = 3 時,應當返回: 3->2->1->4->5

說明 :

  • 你的演算法只能使用常數的額外空間。
  • 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。

解題方法:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode* pre; 
        ListNode* p = head;  
        ListNode* q = head;  
        
        if(!p || k == 1) return p;  
        for(int i = 1; i < k; i ++){
            if(!q->next)    return head;
            q = q->next;
        }
        pre = p;  
        head = q;
        while(p->next != head){
            q = p->next;
            p->next = p->next->next;
            q->next = pre;
            pre = q; 
        }
        p->next =  reverseKGroup(head->next, k);
        head->next = pre;
 
        return head;        
    }
};

與前一題相似,比前一題較難。採用遞迴,很好解決,使用時間也較少。

涉及到連結串列指標的題目都還比較好想。