/**
* 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) {
ListNode h;
h.next = head;
ListNode *p[5010];
for(p[0] = &h;;){
ListNode *pp = p[0];
bool end = false;
for(int i = 1;i <= k;i++){
p[i] = pp->next;
if(p[i] == nullptr){
end = true;
break;
}
pp = pp->next;
}
if(end) break;
p[0]->next = p[k];
p[1]->next = p[k]->next;
for(int i = k;i > 1;i--)
p[i]->next = p[i - 1];
p[0] = p[1];
}
return h.next;
}
};
这一题是两两翻转链表节点的升级版。
可以先手动模拟该变换过程,在确定需要存储的指针信息和替换顺序。
因为需要存储的指针信息比较多且长度不固定,所以应该考虑使用数组和循环进行维护。
题目链接
原创不易,感谢支持!