数据结构算法--链表系列 1.判断链表是否有环及求环点

# coding: utf-8

"""
判断是否相交求交点,判断是否有环,求环点,都可以利用hashset的方法,


"""




from  __future__ import print_function
class LinkNode:
    def __init__(self, val):
        self.val = val
        self.next = None


val_list = [5, 4, 9, 1, 0,4]
node_list = [LinkNode(_) for _ in val_list]

for i in range(1, len(node_list)):
    node_list[i-1].next = node_list[i]


def traverse(head):
    if head is None:
        print()
        return 
    print(head.val, end=',')

    traverse(head.next)

traverse(node_list[0])

#判断是否有环,快慢指针

def has_cycle(head):
    """
        判断链表是否有环,通过快慢指针

    """
    slow = head
    fast = head
    while slow and fast:
        slow = slow.next
        fast = fast.next

        if fast is None: # 相当于两条平行线,没有交点
            return False

        # fast 在走一步
        fast = fast.next
        if fast === slow:
            return True

    return False


def get_cycle_node(head):
    """
        两个指针的交点到环点的距离与头结点到交点的距离相等
    """

    p = head
    q = head

    meet = None
    while p and q:
        p = p.next
        q = q.next
        if q is None:
            return None
        q = q.next
        if p == q:
            meet = q
            break

    if meet is None:
        return None

    # 从头结点和meet结点同时出发
    while meet and head:

        if meet == head:
            return meet
        else:
            meet == meet.next
            head = head.next

    return None


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值