LeetCode25.k個一組翻轉連結串列
阿新 • • 發佈:2018-12-18
題目描述:
該題目是對反轉一個連結串列的升級版。
演算法描述:
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; } };