K 个一组翻转链表
题目链接:K 个一组翻转链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode* p ,*q,*pBeg,*pEnd;
p = head;
int cnt = 0;
ListNode* pTail = NULL;
int num = 0;
for(p = head;p!=NULL;p=p->next){
if(cnt == 0){
//end的备选节点
pEnd = p;
}
cnt++;
if(cnt == k){
if(num == 0){ //记录最终返回的头结点
head = p;
}
num++;
//计数器归0
cnt = 0;
//begin的备选节点
pBeg = p;
q = p->next;
//进行局部反转
myReverseK(pEnd,q);
if(pTail!=NULL){ //左连接
pTail->next = pBeg;
}
pEnd->next = q; //右连接
p = pEnd; //恢复p,保证循环正常
pTail = pEnd;
//pTail->next == NULL; 人为断开了
}
}
return head;
}
void myReverseK(ListNode* head,ListNode* stopPointer){
ListNode* last,*p,*q;
last = NULL;
p = head;
while(p!=stopPointer){
q = p->next;
p->next = last;
last = p;
p = q;
}
}
};