美文网首页
利用快慢指针获取链表闭环的入口

利用快慢指针获取链表闭环的入口

作者: 梁森的简书 | 来源:发表于2021-02-01 23:44 被阅读0次

创建两个指针分别指向头节点,同时创建一个临时空指针,当快慢指针相遇的时候(有闭环),将临时空指针指向头节点,同时继续继续下次循环,当慢指针和临时指针相遇,则此节点就是闭环入口。

/// 快慢指针获取环状链表的入口
    private func testEntrance() {
        let firstNode = Node(item: "1", next: nil)
        let secondNode = Node(item: "2", next: nil)
        let thirdNode = Node(item: "3", next: nil)
        let forthNode = Node(item: "4", next: nil)
        let fifthNode = Node(item: "5", next: nil)
        let sixthNode = Node(item: "6", next: nil)
        let seventhNode = Node(item: "7", next: nil)
        let eightNode = Node(item: "8", next: nil)
        
        firstNode.next = secondNode
        secondNode.next = thirdNode
        thirdNode.next = forthNode
        forthNode.next = fifthNode
        fifthNode.next = sixthNode
        sixthNode.next = seventhNode
        seventhNode.next = eightNode
        
        eightNode.next = fifthNode
        
        let node = getEntrance(firstNode: firstNode)
        print("node.item:\(node.item ?? "")")
    }
    
    private func getEntrance(firstNode: Node?) -> Node {
        var fast = firstNode
        var slow = firstNode
        var temp: Node?
        while fast != nil && fast!.next!.next != nil {
            fast = fast!.next!.next!
            slow = slow!.next!
            if fast! == slow! { // 应该是比较节点是否相同
                if temp == nil {    // 被赋值之后就不再管快慢指针了
                    temp = firstNode
                    continue    // 循环体立刻停止本次循环迭代,重新开始下次循环迭代
                }
            }
            if temp != nil {
                temp = temp!.next!
                if slow! == temp! {
                    break
                }
            }
        }
        return slow!
    }

demo地址:https://github.com/yangguanghei/studyDateStructure

相关文章

  • 利用快慢指针获取链表闭环的入口

    创建两个指针分别指向头节点,同时创建一个临时空指针,当快慢指针相遇的时候(有闭环),将临时空指针指向头节点,同时继...

  • 利用快慢指针查看链表是否有闭环

    创建两个指针分别指向头节点,快指针每次移动两位,慢指针每次移动一位,如果快慢指针能相遇则说明链表有闭环。 demo...

  • 数据结构与算法整理

    (1)链表的技巧 快慢指针(找环,环入口,环长度) 双指针(倒数K个节点) 合并链表(递归求解) 约瑟夫环(环形链...

  • 利用快慢指针获取链表的中间值

    创建两个指针分别指向头节点,快指针每次移动两位,慢指针每次移动一位,当快指针移动到最后一位的时候,慢指针指向的位置...

  • 算法学习--双指针

    双指针分类 快慢指针 左右指针 快慢指针:主要解决链表相关问题,比如:典型的判断链表中是否包含环、链表倒是第K个节...

  • 算法题整整理

    1.链表是否有环,找出环的入口 答: 是否有环,快慢指针,最后两个指针重合了,就有环。 环入口:思路如下,设hea...

  • 面试题20:链表中环的入口节点

    题目:如果一个链表中包含环,如何找到环的入口节点思路:分为判断是不是有环,找环的入口 快慢指针,如果快指针能够追上...

  • [Leetcode] 876. 链表的中间结点

    876. 链表的中间结点 来源: 876. 链表的中间结点 1. 解题思路 利用快慢指针 2. 代码

  • 链表

    单向链表 链表反转 判断是否有环,找链表的中间节点 快慢指针 找环的入口(求两个链表的交点可以转化成这个问题) p...

  • 快慢指针的应用

    快慢指针的快慢主要是指在遍历链表过程中指针移动速度的快慢。比如遍历单链表,我们可以让指针每次移动一个节点,也可以让...

网友评论

      本文标题:利用快慢指针获取链表闭环的入口

      本文链接:https://www.haomeiwen.com/subject/nskdtltx.html