题目
给你一个链表,每 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
思路
1、遍历链表,记录k个节点的起始节点,累计满k个节点,根据起始节点进行翻转即可; 2、最后记得连接剩余不满足k个节点的节点即可; 调试过程中遇到几次时间超限,但是看着代码又没有死循环,感觉自己眼神不好了,后来发现是链表没有连接好,链表有环了。
程序
struct ListNode
* reverseKGroup(struct ListNode
* head
, int k
){
int i
= 0;
struct ListNode
* node
= head
;
struct ListNode
* pre
= NULL;
struct ListNode
* sonnode
= NULL;
struct ListNode
* sonhead
= NULL;
struct ListNode
* sonpre
= NULL;
struct ListNode
* sonnext
= NULL;
if(k
==1) return head
;
while(node
){
i
++;
if(i
==1){
sonhead
= node
;
}
node
= node
->next
;
if(i
==k
){
sonpre
= NULL;
sonnode
= sonhead
;
while(i
>0 && (sonnode
!= NULL)){
i
--;
sonnext
= sonnode
->next
;
sonnode
->next
= sonpre
;
sonpre
= sonnode
;
sonnode
= sonnext
;
}
if(pre
== NULL){
head
=sonpre
;
}else{
pre
->next
= sonpre
;
}
i
=0;
pre
= sonhead
;
sonhead
= NULL;
}
}
if(sonhead
!= NULL && pre
!= NULL){
pre
->next
= sonhead
;
}
return head
;
}