代码思路
K个一组翻转,那就想办法将K个节点放在一组。
定义三个指针:
locate定位要翻转的k节点个中最后一个,也就是翻转后的第一个。
now定位翻转后的最后一个也就是当前的第一个。
last定位的是这k个节点的前一个节点,方便插入操作。
这样的话通过这三个定位指针我们就可以轻松实现翻转。
详细的思路见代码注释。
手绘图预警!
通过结果还ok。
具体代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* del(ListNode* pre){
//删除pre的下一个节点并返回删除节点
ListNode* node = pre->next;
pre->next=node->next;
node->next=NULL;
return node;
}
ListNode* reverseKGroup(ListNode* head, int k) {
//每k个一组翻转,通过指针定位,实现判断翻转完成及下一组的开始位置
ListNode *dummy=new ListNode(-1);
dummy->next=head;
//locate定位要翻转的k节点个中最后一个,也就是翻转后的第一个。now定位翻转后的最后一个也就是当前的第一个,last定位的是这k个节点的前一个节点,方便插入操作。
ListNode *locate=dummy,*last=dummy,*now=dummy->next;
while(now){
int x=0;
while(x!=k){
//找到locate该定位的位置
locate=locate->next;
x++;
if(!locate) return dummy->next; //找到NULL,剩下的数不足k个,直接返回即可。
}
while(last->next!=locate){
//翻转操作,将每个删除的节点放在locate后面
ListNode *node = del(last);
node->next=locate->next;
locate->next=node;
}
locate=now; //更新这三个定位指针
last=now;
now=last->next;
}
return dummy->next;
}
};