https://oj.leetcode.com/problems/reverse-nodes-in-k-group/
使用一个计数器cn,当cn%k=0时进行翻转,翻转时需要把这组链表前面的一个节点的next值也做相应的设置。并且翻转后最后一个节点的next值也需要设置。考虑这些之后小心操作链表即可,如果想要一次写出bug-free的代码则需要仔细考虑链表的各处指针是否正确。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void Reverse(ListNode *in,ListNode *out,ListNode *&h,ListNode *&t){
ListNode *p=h;
while(h->next!=out){
ListNode *q=h->next;
h->next=q->next;
q->next=p;
if (in!=NULL) in->next=q;
p=q;
}
t=h;
h=p;
}
ListNode *reverseKGroup(ListNode *head, int k) {
if (head==NULL) return NULL;
ListNode *l=head;
ListNode *r=head;
ListNode *lp=NULL;
ListNode *h=head;
bool first=false;
int cn=1;
while(r!=NULL){
if (cn%k==0) {
Reverse(lp,r->next,l,r);
if (!first){
h=l;
first=true;
}
lp=r;
l=r->next;
}
r=r->next;
cn++;
}
return h;
}
};