链表中每k个一组进行反转
将给出的链表中的节点每k个一组进行反转,返回反转后的链表。如果链表中的结点不是k的倍数,将最后剩下的结点保持原样。如:1->2->3->4->5。k=2,结果是2->1->4->3->5。
思想:将k个结点头插法插到上一组的尾结点的后面。最后剩下不足k个元素的部分,已经被反转,需要反转回来。
代码:
void reverseK(LinkList L,int k){LNode *head=L,*p=L->next,q,end;int count = 0;while(p!=NULL){if(count == 0) end=p;//本次反转的最后一个结点q=p->next;//存后继结点p->next=head->next;//头插到head后面 head->next=p; if(++count==k){//进行下一组反转 count =0;head=end;}p=q;} end->next=NULL;//最后一个结点的next置空 if(count!=0){//最后面不足k个结点不用反转,将其反转回来。 end=p=head->next;//本次反转的最后一个结点 while(p!=NULL){q=p->next;//暂存后继 p->next=head->next;//头插到head后面 head->next=p;p=q;}end->next=NULL;//最后一个结点的next置空 }}
时间复杂度O(n);空间复杂度O(1)