题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
http://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
/**
* 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 * reverseListNode(ListNode * head){
ListNode *pre=nullptr;
ListNode *now=head;
while(now!=nullptr){
ListNode *last=now->next;
now->next=pre;
pre=now;
now=last;
}
return pre;
}
ListNode* reverseKGroup(ListNode* head, int k) {
//临时节点
ListNode *dummy=new ListNode(-1);
dummy->next=head;
ListNode *start=head;
//每一次反转的前一个节点
ListNode *pre=dummy;
//每一次反转的最后一个节点
ListNode *lastTempNode=nullptr;
int cnt=0;
while(start!=nullptr){
lastTempNode=start;
//每次反转之后,的下一个节点
start=start->next;
cnt++;
if(cnt==k){
cnt=0;
//反转开始的头节点
ListNode *tempHead=pre->next;
//反转的最后一个节点指向空
lastTempNode->next=nullptr;
ListNode* newStart=reverseListNode(tempHead);
//反转完之后,pre节点指向新的头节点
pre->next=newStart;
//反转完之后,新的尾节点指向下一个节点
tempHead->next=start;
//重新赋值头节点
pre=tempHead;
}
}
return dummy->next;
}
};