Go语言学习之力扣-旋转链表|Go主题月

855 阅读1分钟

作者:看那个码农

公众号:看那个码农

上期内容介绍了Go语言学习之力扣-删除排序链表中的重复元素|Go主题月

  • 删除排序链表中的重复元素

本篇内容将继续带领大家走进Go语言的世界。

1.本文简介

Go语言学习之力扣-旋转链表

来源于:Leetcode61. 旋转链表

2.题目描述

给你一个链表的头节点head,旋转链表,将链表每个节点向右移动k个位置。

image.png

示例 1

输入:head = [0,1,2], k = 2
输出:[1,2,0]

提示:

  • 链表中节点的数目在范围[0, 500]
  • -100 <= Node.val <= 100
  • 0 <= k <= 2 * 10910^9

3.思路与方法

1.特殊情况的分析:我们在对链表进行操作时,应该首先考虑到几个问题。

  • 链表长度不大于1的话,此时链表长度为或者为1,不管怎么移动都还是原来的链表,此时直接输出链表。
  • 当需要移动的次数k0或者为链表长度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
}

力扣结果输出为:

image.png

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。