leetcode題庫——k個一組翻轉連結串列
阿新 • • 發佈:2018-11-11
題目描述:
給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。
k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。
示例 :
給定這個連結串列:1->2->3->4->5
當 k = 2 時,應當返回: 2->1->4->3->5
當 k = 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) { if(head==NULL||head->next==NULL||k==1) return head; ListNode *p,*q,*l; ListNode *flag,*flag1,*flag2,*flag3; int count=1; flag=head; int num=1; while(flag->next!=NULL)//k>連結串列長度 { flag=flag->next; num++; } if(num<k) return head; l=head; p=head; q=head->next; flag1=p; flag=p; while(count<k&&flag1->next!=NULL)//找新表頭 { flag1=flag1->next; count++; } flag1=flag1->next; if(count<k) return l; else{ flag2=q; while(flag2!=flag1) { flag2=q->next; q->next=p; p=q; q=flag2; } l=p; head->next=q; } while(flag1!=NULL){//剩下部分 count=1; while(count<k&&flag1->next!=NULL) { flag1=flag1->next; count++; } flag1=flag1->next; if(count<k)return l; else{ p=q; q=p->next; flag3=p; while(flag2!=flag1) { flag2=q->next; q->next=p; p=q; q=flag2; } flag->next=p; flag3->next=q; flag=flag3; } } return l; } };
思路:
每k個一組進行翻轉,其中先執行一次,找到新連結串列表頭,然後就是各種複雜的指標交換。。。要設定兩個指標用於連線新翻轉的部分。舉個例子按照程式碼畫一遍就知道了。