1. 程式人生 > >LeetCode25.k個一組翻轉連結串列

LeetCode25.k個一組翻轉連結串列

題目描述:

該題目是對反轉一個連結串列的升級版。

演算法描述:

1.判斷連結串列,若連結串列為空或k=1直接返回head。

2.每k個結點遍歷連結串列。相當於把一個大連結串列分成k個結點為連結串列的小連結串列。

3.讓每個連結串列都進行反轉,最後再把這些連結串列連線起來就可以了。

程式碼如下:

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode* p = head;  
        ListNode* r; 
        //若連結串列為空或k=1直接返回head
        if(!p || k == 1) 
            return p;  
        for(int i = 1; i < k; i ++){
            //若剩餘結點不夠k個則直接返回head
            if(!p->next)    
                return head;
            p = p->next;
        }
        //p,r為分界線,p為前面需要倒置的連結串列的最後一個結點,r為進入遞迴的第一個節點(head)
        r = p->next;
        //擷取連結串列
        p->next = NULL;
        //temp為倒置後的連結串列
        ListNode* temp = reverse(head);
        ListNode* newHead = temp;
        //找到連結串列最後
        while(temp->next){
            temp= temp->next;
        }
        //在連結串列最後遞迴拼接需要倒置的其他連結串列
        temp->next = reverseKGroup(r,k);
        return newHead;
    }
    //反轉連結串列方法
    ListNode* reverse(ListNode* head) {
        ListNode *p,*newHead=NULL;
       	while(head){
       		p=head;
       		head=head->next;
       		p->next=newHead;
       		newHead=p;
		}
        return newHead;
    }
};