zoukankan      html  css  js  c++  java
  • 23-链表中环的入口节点

    题目:如果一个链表中包含环,如何找出环的入口节点。

    # 找出环状链表的分支结点
    def has_cir(head):
        if not head:
            return False
        p = head
        q = head
        while p:
            p=p.next
            if p:
                p=p.next
            else:
                return False
            q = q.next
            if p==q:
                return True
    
    # 找出环内结点个数
    def node_count_cir(head):
        cnt = 1
        if has_cir(head):
            p,q = head,head.next.next
            while True:
                if p == q:
                    break
                p=p.next
                q=q.next.next
    
            p2=p.next
            while p2!=p:
                p2=p2.next
                cnt+=1
            return cnt
    
        return 0
    
    # 找出环内第一个结点
    def node_first_cir(head):
        node_cnt_cir = node_count_cir(head)
        p,q=head,head
        for i in range(node_cnt_cir):
            p=p.next
        while p!=q:
            p=p.next
            q=q.next
        return p.data
    

    注:

    本题要找出环的入口节点,主要分三步:

    1、判断该链表是否有环(使用快慢指针,如果相遇则证明有环)

    2、如果有环,则快慢指针的相遇点必在换内,这一步判断换内节点总数(从该节点遍历,直到回到该节点的长度)

    3、使用两个指针,第一个指针先走环内节点数量的步数,然后两个指针同时往后遍历,当两个指针指到同一个节点时,即为环的入口点

  • 相关阅读:
    Eclipse修改JSP文件的默认编码
    RPM常用命令总结
    软链接的妙用
    多线程练习
    Spring整合struts的配置文件存放问题
    使用struts框架后的404错误
    俄罗斯方块中的编程思想
    引用类型的强制类型转换
    数据库还原的问题
    常用sql语法初级
  • 原文地址:https://www.cnblogs.com/kingshine007/p/11354310.html
Copyright © 2011-2022 走看看