題目描述
給你一個鏈表,每 k 個節點一組進行翻轉,請你返回翻轉後的鏈表。
k 是一個正整數,它的值小於或等於鏈表的長度。
如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。
說明:
你的算法只能使用常數的額外空間。
你不能只是單純的改變節點內部的值,而是需要實際進行節點交換。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
示例:
給你這個鏈表:1->2->3->4->5
當 k = 2 時,應當返回: 2->1->4->3->5
當 k = 3 時,應當返回: 3->2->1->4->5
解題思路:
先求出鏈表長度,計算出鏈表最多有幾個k組,
然後依次翻轉
pre | cur | nextnode | ....... | |
需要翻轉的k段 |
這裏需要特別注意:如何做到不斷鏈翻轉
額外引入pre節點
nextnode = cur->next;
cur->next = nextnode->next;
nextnode->next = pre->next;
pre->next = nextnode;
完整代碼如下:
/**
* 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) {
int len = 0;
ListNode *tmp = new ListNode(0);
ListNode *prev = tmp;
ListNode *cur=head;
ListNode *nextnode;
tmp->next = head;
while(head){
len++;
head = head->next;
}
head = tmp->next;
int cnt = len/k;
if(cnt==0) return head;
for(int i=0;i<cnt;i++){
for(int j=0;j<k-1;j++){
nextnode = cur->next;
cur->next = nextnode->next;
nextnode->next = prev->next;
prev->next = nextnode;
}
prev = cur;
cur = prev->next;
}
return tmp->next;
}
};