乐趣区

关于链表:PHP-和-Go-实现环路链表检测

原文链接:何晓东 博客

环路链表检测

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

起源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl…

解题思路 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;
    }
}

最初恰饭 阿里云全系列产品 / 短信包特惠购买 中小企业上云最佳抉择 阿里云外部优惠券

退出移动版