链表结点每k个翻转一次
链表中的节点每k个一组翻转
http://www.nowcoder.com/questionTerminal/b49c3dc907814e9bbfa8437c251b028e
这道题也是链表的翻转,每k个结点翻转一次,所以需要记录几个关键点:
如图所示,需要记录下每段第一个也就是翻转后的第k个节点,即在每一段中
中翻转后,我们需要保留有前一段的结束结点,这一段的开始结点,这一段的
结束结点位置。然后把他们关联起来就可以了。
ListNode* reverseKGroup(ListNode* head, int k) { // write code here //若k小于2,直接返回 if(k<2) return head; int i=1,cnt=1; //pr1前一段结束位置节点 //pr2这一段结束位置节点 ListNode* left; ListNode* pr1=NULL; ListNode* pr2=NULL; ListNode* output=head; while(head) { if(i==1) { left=head; pr2=left; } head=head->next; i++; cnt++; //因为先head=head->next;,所以需要判断head,否则可能越界 if(head==NULL) break; if(cnt==k) output=head; //k长度翻转 if(i==k) { ListNode* right=head->next; ListNode* mid=left->next; left->next=right; while(mid!=right) { ListNode* tmp=mid->next; mid->next=left; left=mid; mid=tmp; } //更新pr1,pr1不存在那就是第一段k长度链表 if(pr1) pr1->next=left; pr1=pr2; //更新head结点位置 head=right; i=1; } } //输出output,要么是原链表第一个结点,要么是第k个节点 return output; } };