zoukankan      html  css  js  c++  java
  • 判断单链表是否有环,并找出环的入口python

    1、如何判断一个链表是否有环?

    2、如果链表为存在环,如果找到环的入口点?

    1.限制与要求

    • 不允许修改链表结构。
    • 时间复杂度O(n),空间复杂度O(1)。

    2.思考

    2.1判断是否有环

    如果链表有环,那么在遍历链表时则会陷入死循环,利用这个特征,我们可以设计这样的算法。

    • 使用一个slow指针,一个fast指针。
    • slow指针一次往后遍历以1个节点,fast指针一次往后遍历2个节点,一直做这样的操作。

    • 如果fast指针在遍历过程中,遍历到了NULL节点说明链表没有环。

    • 否则当slow指针和falst指针相同,则说明环有节点。

    2.2环的入口节点

    我们假定链表头到环入口的距离是len,环入口到slow和fast交汇点的距离为x,环的长度为R。slow和fast第一次交汇时,设slow走的长度为:d = len + x,而fast走的长度为:2d = len + nR + x,(n >= 1),从而我们可以得知:2len + 2x = len + nR + x,即len = nR - x,(n >= 1),于是我们可以得到这样的算法。

    • 使用一个cur指针指向链表头节点,一个inter指针指向第一次的交汇点。

    • cur指针和inter指针一起往后遍历。

    • cur指针和inter指针相等时,cur和inter指针指向的就是环的入口节点。

     

    inter指针在遍历过程中可能多次(n >= 1)经过环入口节点,但当cur指针第一次达到入口节点时,inter指针此时必然也指向入口节点。

     


    class Node():
    def __init__(self,item):
    self.item =item
    self.next=None

    def test(head):
    low = head
    high = head
    cur = None
    if head==None:
    return False
    while high.next!=None and high.next.next!=None:
    low = low.next
    high = high.next.next
    if low==high:
    cur = low
    l = head
    while cur.next:
    cur=cur.next
    l=l.next
    if cur==l:
    return l.item
    return False

    node1 = Node(1)
    node2 = Node(2)
    node3 = Node(3)
    node4 = Node(4)
    node5 = Node(5)
    node1.next = node2
    node2.next = node3
    node3.next = node4
    node4.next = node5
    node5.next = node2

    t=test(node1)
    print(t)

    判断两个单链表是否相交,如果相交,给出相交的第一个点(两个链表都不存在环)。
    使用哈希表,即python中的字典。先遍历一个链表,并将链表内容放入字典。再遍历另外一个链表,看遍历到的位置是否存在于字典中,存在则返回当前结点。若遍历结束仍不存在则返回空。检索复杂度为O(m+n),空间复杂度O(m+n)
  • 相关阅读:
    linux之awk命令
    HDU 2097 Sky数 进制转换
    HDU 2077 汉诺塔IV
    HDU 2094 产生冠军 dfs加map容器
    HDU 2073 叠框
    HDU 2083 简易版之最短距离
    HDU 2063 过山车 二分匹配
    天梯 1014 装箱问题
    天梯 1214 线段覆盖
    天梯 1098 均分纸牌
  • 原文地址:https://www.cnblogs.com/limingqi/p/12376538.html
Copyright © 2011-2022 走看看