25. K 个一组翻转链表
K 个一组翻转链表
题目描述:
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
进阶:
你可以设计一个只使用常数额外空间的算法来解决此问题吗?
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例 1:
输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]
示例 2:
输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]
示例 3:
输入:head = [1,2,3,4,5], k = 1
输出:[1,2,3,4,5]
示例 4:
输入:head = [1], k = 1
输出:[1]
提示:
列表中节点的数量在范围 sz 内
1 <= sz <= 5000
0 <= Node.val <= 1000
1 <= k <= sz
思路:
先遍历k遍判断有没有到终点,遍历之后找到一段的tail和head,然后进入reverse函数,倒转head和tail,表的head和tail连接主表的pre和nex
pre.Next=head
tail.Next=nex
代码:
func reverseKGroup(head *ListNode, k int) *ListNode {
hair := &ListNode{Next: head}
pre:=hair
if k==1{
return head
}else{
for head!=nil{
tail:=pre
//判断结点数量大不大于k个
for i:=0;i<k;i++{
tail=tail.Next
if tail==nil{
return hair.Next
}
}
nex:=tail.Next
head,tail=reverse(head,tail)
pre.Next=head
tail.Next=nex
pre=tail
head=tail.Next
}
}
return hair.Next
}
func reverse(head,tail *ListNode)(*ListNode,*ListNode){
var head2 *ListNode=nil
p:=head
tail.Next=nil
for p!=nil{
tmp:=p.Next
p.Next=head2
head2=p
p=tmp
}
return head2,head
}
代码效率:
执行用时:4 ms, 在所有 Go 提交中击败了90.13%的用户
内存消耗:3.6 MB, 在所有 Go 提交中击败了50.96%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!