给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明 :
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解析:
该题目是链表反转的一个变型,但是题目难度大大增加了。该题目需要一段一段的处理,首先找到长度为k的链表的头和尾,然后执行反转操作,将头部的节点以头插法的方式加入到尾节点的后面。然后向后执行剩余的段。
代码:
//摘录自leetcode中的题解
/ *
*prev
*tail head
*dummy 1 2 3 4 5
*----------------------------
*prev head tail
*dummy 1 2 3 4 5
* cur
*----------------------------
* 每次让prev.next的元素插入到当前tail之后,这样tail不断前移,被挪动的元素头插入tail之后的链表
*prev tail head
*dummy 2 3 1 4 5
* cur
*----------------------------
*prev tail head
*dummy 3 2 1 4 5
* cur
*----------------------------
* prev
* tail
* head
*dummy 3 2 1 4 5
*----------------------------
* prev head tail
*dummy 3 2 1 4 5 null
*----------------------------
*/
作者:carryzz
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/c-liang-chong-jie-fa-bian-li-di-gui-dai-xiang-xi-z/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode* dummy=new ListNode(0);
dummy->next=head;
ListNode* pre=dummy;
ListNode* cur=head;
ListNode* tail=dummy;
while(true){
int count=0;
tail=pre;
while(tail!=NULL&&count<k){
tail=tail->next; //退出循环后tail指向待反转链表的末尾节点
count++;
}
if(tail==NULL)
break;
while(pre->next!=tail){ //pre->next==tail时退出循环
cur=pre->next;//(1)
pre->next=cur->next; //(1) 步骤(1):将cur从链表中切出来
cur->next=tail->next;//(2)
tail->next=cur; //(2) 步骤(2):将cur添加到tail后
}
pre=head;
tail=head;
head=pre->next;//head指向新的待翻转的链表头
}
return dummy->next;
}
};