golang中怎么利用leetcode实现一个环形链表

golang中怎么利用leetcode实现一个环形链表,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

创新互联公司从2013年开始,先为建瓯等服务建站,建瓯等地企业,进行企业商务咨询服务。为建瓯企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

说明:不允许修改给定的链表。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。

golang中怎么利用leetcode实现一个环形链表

示例 2:

输入:head = [1,2], pos = 0
输出:tail connects to node index 0
解释:链表中有一个环,其尾部连接到第一个节点。

golang中怎么利用leetcode实现一个环形链表

示例 3:

输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。

golang中怎么利用leetcode实现一个环形链表

解题思路:

1,首先用快慢指针判断是否有环

2,假设快慢指针相遇的位置为环起点m后第p个位置,环剩余q个位置

则:

A,m+p=2*(m+p)-k*(p+q)        k为整数,跟m长度与环大小比有关

B,假设k=1 则,m=q

C,m=k*(p+q)-p=(k-1)*(p+q)+q   

3,由此可知,如果慢指针从相遇位置开始,新指针从头开始,则相遇位置一定为环起点

/** * Definition for singly-linked list. * type ListNode struct { *     Val int *     Next *ListNode * } */func detectCycle(head *ListNode) *ListNode {    fast:=head    slow:=head    flag:=false    for fast!=nil && fast.Next!=nil{        fast=fast.Next.Next        slow=slow.Next        if fast!=nil && slow==fast{            flag=true            break        }    }    if !flag{        return nil    }    fast=head    for fast!=slow{        fast=fast.Next        slow=slow.Next    }    return fast}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。


文章题目:golang中怎么利用leetcode实现一个环形链表
浏览路径:http://ybzwz.com/article/gejijc.html