作者:看那个码农
公众号:看那个码农
上期内容介绍了Go语言学习之力扣-删除排序链表中的重复元素|Go主题月
- 删除排序链表中的重复元素
本篇内容将继续带领大家走进Go语言的世界。
1.本文简介
Go语言学习之力扣-旋转链表
来源于:Leetcode61. 旋转链表
2.题目描述
给你一个链表的头节点head,旋转链表,将链表每个节点向右移动k个位置。
示例 1
输入:head = [0,1,2], k = 2
输出:[1,2,0]
提示:
- 链表中节点的数目在范围
[0, 500]内 - -100 <= Node.val <= 100
- 0 <= k <= 2 *
3.思路与方法
1.特殊情况的分析:我们在对链表进行操作时,应该首先考虑到几个问题。
- 链表长度不大于
1的话,此时链表长度为空或者为1,不管怎么移动都还是原来的链表,此时直接输出链表。 - 当需要移动的次数
k为0或者为链表长度n的倍数时,这时也是直接输出链表就好了。
2.将链表连接成环:首先要计算链表的长度n,并找到链表的末尾节点,将该节点与头节点相连,这样就得到了一个闭合为环的链表。
3.找到新断开节点:闭合为环的链表后,我们需要根据链表移动的个数,找到我们需要断开的那个节点,即((n−1)−(k%n))最终将得到的新链表输出即可。
4.具体实现代码
func rotateRight(head *ListNode, k int) *ListNode {
//特殊情况的分析:链表是否为空、链表长度是否为1,移动次数是否为0
if head==nil||head.Next==nil||k==0{
return head
}
node:=head
count:=1
//统计链表的长度count
for node.Next!=nil{
node=node.Next
count++
}
//计算真正需要移动的步数
k=k%count
//特殊情况的分析:移动次数k是否为链表长度count的倍数
if k==0{
return head
}
//1.先成环、尾结点链接头结点
node.Next=head
//2.找到闭合成环链表的尾结点
newnode:=head
for i:=0;i<count-1-k;i++{
newnode=newnode.Next
}
//3.找到闭合成环链表的头结点
newhead:=newnode.Next
//4.断开
newnode.Next=nil
return newhead
}
力扣结果输出为:
如果你觉得这篇内容对你有帮助的话:
1、点赞支持下吧,让更多的人也能看到这篇内容
2、关注公众号:看那个码农,我们一起学习一起进步。