当前位置:Gxlcms > PHP教程 > PHP和Go如何进行环路链表检测

PHP和Go如何进行环路链表检测

时间:2021-07-01 10:21:17 帮助过:22人阅读

链表中环的入口结点问题是一个超级经典的问题,不管是在面试中,还是考研的过程中都是一个经典问题。通常的公认解法就是双指针(快慢指针)的解法,当然这已经的老生长谈的了。今天我们就来介绍介绍。

给定一个链表,如果它是有环链表,实现一个算法返回环路的开头节点。 有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路。

解题思路 1

遍历链表,同时将每次的结果放到 map 中,如果有元素重复出现,则是有环形链表

  1. /**
  2. * Definition for singly-linked list.
  3. * type ListNode struct {
  4. * Val int * Next *ListNode
  5. * }
  6. */
  7. func detectCycle(head *ListNode) *ListNode {
  8. visited := make(map[*ListNode]struct{}, 1)
  9. work := head
  10. for work != nil {
  11. _, ok := visited[work]
  12. if ok {
  13. return work
  14. } else {
  15. visited[work] = struct{}{}
  16. }
  17. work = work.Next
  18. }
  19. return nil}

解题思路 2

快慢指针求解:我们定义两个指针,一快一满。慢指针每次只移动一步,而快指针每次移动两步。初始时,慢指针在位置 head,而快指针在位置 head.next。这样一来,如果在移动的过程中,快指针反过来追上慢指针,就说明该链表为环形链表。否则快指针将到达链表尾部,该链表不为环形链表。

  1. /**
  2. * Definition for a singly-linked list.
  3. * class ListNode {
  4. * public $val = 0;
  5. * public $next = null;
  6. * function __construct($val) { $this->val = $val; }
  7. * }
  8. */class Solution {
  9. /**
  10. * @param ListNode $head * @return Boolean
  11. */
  12. function hasCycle($head) {
  13. $fast = $head;
  14. $slow = $head;
  15. while ($fast != null && $fast->next != null) {
  16. $fast = $fast->next->next;
  17. $slow = $slow->next;
  18. if ($fast === $slow) {
  19. return true;
  20. }
  21. }
  22. return false;
  23. }}

推荐:《2021年PHP面试题大汇总(收藏)》《php视频教程》

以上就是PHP和Go如何进行环路链表检测的详细内容,更多请关注gxlcms其它相关文章!

人气教程排行