2021年3月4日 周四天气晴 【不悲叹过去,不荒废现在,不惧怕未来】
1. 题目简介
2. 题解(模拟法)
朴实无华的模拟法:思路类似于 Leetcode 92. 反转链表 II,只不过更复杂一些,需要每次根据头尾结点反转k
个结点,然后把断掉的地方接上,直到剩下的结点不足k
个为止。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
if(k==1) return head;
ListNode* preHead = new ListNode(0);
preHead->next = head;
ListNode* pre = preHead;
while(1){
// 查看剩余部分长度是否大于等于 k
int n = k;
while(n && head){
--n;
head = head->next;
}
if(n>0) break;
ListNode* beg = reverse_k(pre->next,k);
// 把翻转后链表的头和尾都接上
ListNode* tmp = pre->next;
tmp->next = head;
pre->next = beg;
pre = tmp;
}
return preHead->next;
}
// 翻转链表前k个结点
ListNode* reverse_k(ListNode* head, int k){
ListNode* pre = head;
head = head->next;
for(int i=1;i<k;++i){
ListNode* tmp = head->next;
head->next = pre;
pre = head;
head = tmp;
}
return pre;
}
};
参考文献
https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/k-ge-yi-zu-fan-zhuan-lian-biao-by-leetcode-solutio/