题目:是23题2个结点一翻转的扩展,给一个链表,K个结点一翻转,最后不够K个的不改变。
分析:可以用递归做,觉得不好搞,就用了迭代。定义reverseList函数用来翻转K个结点的list。
class Solution{
public:
ListNode *reverseKGroup(ListNode *head, int k) {
ListNode dummy(-1);
dummy.next=head;//定义一个虚结点方便。
ListNode *newHead,*newPrev;//
newHead=newPrev=&dummy;
int count=0;
ListNode *pNode=head;//pNode用来遍历。
ListNode *pPrev=head;
while(pNode){
count++;//到K时要翻转
ListNode *pNext=pNode->next;
if(count==k){
newPrev->next=reverseList(pPrev,pNext);//newPrev保存的是已翻转好的链表最后一个结点。
newPrev=pPrev;//pPrev保存的是待翻转短链表的首结点
pPrev=pNext;//此时的pNext是待翻转链表的后一个结点
count=0;
}
pNode=pNext;
}
newPrev->next=pPrev;由于reverseList会导致前后断链,必须把最后的尾巴链给接上。
return dummy.next;
}
ListNode *reverseList(ListNode *head, ListNode *rear){//翻转head到rear的链表(不包括rear结点)
ListNode *newHead=NULL;
ListNode *pNode=head;
while(pNode!=rear){
ListNode *pNext= pNode->next;
pNode->next=newHead;
newHead=pNode;
pNode=pNext;
}
return newHead;//注意由于是不断地插入待逆置的结点,会导致前后断链。
}
};