力扣旋转链表
// 旋转链表
package linkedlist
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func RotateRight(head *ListNode, k int) *ListNode {
//先判定特殊情况
if head == nil || k == 0 {
return head
}
//存储链表长度
n := 1
//相当于定义一个指针
curr := head
//遍历整个链表
for curr.Next != nil {
curr = curr.Next
n++
}
//连接链表为环
curr.Next = head
//取余,找到需要截断的位置
k %= n
//找到该节点
for i := 0; i < n-k; i++ {
curr = curr.Next
}
//遍历到的节点的下一个才是头结点
head = curr.Next
//当前节点就是新链表的尾结点,所以直接指向null
curr.Next = nil
return head
}
/*
思路:将链表变成一个环,然后在需要处截断链表即可。
第一步:将链表变成环,即遍历链表到最后一个节点,然后让该节点指向头结点,并计数来计算链表长度。
第二步:将K值与链表长度取余,这样就能获取需要旋转的节点,即**新链表**的尾结点。
第三步:截断这个环:将上一步遍历到的节点指向null,然后遍历节点到链表长度-K值,这样所得的位置就是头结点位置。
作者:chicc
链接:https://leetcode.cn/problems/rotate-list/solutions/1426584/golang-by-chicc-6-tq42/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/