这篇文章主要介绍“PHP和Go怎么进行环路链表检测”,在日常操作中,相信很多人在PHP和Go怎么进行环路链表检测问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP和Go怎么进行环路链表检测”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
链表中环的入口结点问题是一个超级经典的问题,不管是在面试中,还是考研的过程中都是一个经典问题。通常的公认解法就是双指针(快慢指针)的解法,当然这已经的老生长谈的了。今天我们就来介绍介绍。
给定一个链表,如果它是有环链表,实现一个算法返回环路的开头节点。 有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路。
解题思路 1
遍历链表,同时将每次的结果放到 map 中,如果有元素重复出现,则是有环形链表
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int * Next *ListNode
* }
*/
func detectCycle(head *ListNode) *ListNode {
visited := make(map[*ListNode]struct{}, 1)
work := head
for work != nil {
_, ok := visited[work]
if ok {
return work
} else {
visited[work] = struct{}{}
}
work = work.Next
}
return nil}
解题思路 2
快慢指针求解:我们定义两个指针,一快一满。慢指针每次只移动一步,而快指针每次移动两步。初始时,慢指针在位置 head,而快指针在位置 head.next。这样一来,如果在移动的过程中,快指针反过来追上慢指针,就说明该链表为环形链表。否则快指针将到达链表尾部,该链表不为环形链表。
/**
* Definition for a singly-linked list.
* class ListNode {
* public $val = 0;
* public $next = null;
* function __construct($val) { $this->val = $val; }
* }
*/class Solution {
/**
* @param ListNode $head * @return Boolean
*/
function hasCycle($head) {
$fast = $head;
$slow = $head;
while ($fast != null && $fast->next != null) {
$fast = $fast->next->next;
$slow = $slow->next;
if ($fast === $slow) {
return true;
}
}
return false;
}}
到此,关于“PHP和Go怎么进行环路链表检测”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注天达云网站,小编会继续努力为大家带来更多实用的文章!