Python中的循环列表检测?

Python中的循环列表检测?,python,algorithm,linked-list,circular-list,Python,Algorithm,Linked List,Circular List,在Python中是否有方法检测循环列表的第一个元素?在爪哇和C++中,你可以只建立一个指向第一个元素的指针。 我遇到的问题:给定一个循环链表,实现一个算法,返回循环开始处的节点。我认为您需要一个深度优先搜索来回答这个问题。一般来说,下面是这类问题: a = [1,2,3] b = [4,5,6] a[1] = b b[2] = a def is_list(l): try: it = iter(l) return l except TypeErro

在Python中是否有方法检测循环列表的第一个元素?在爪哇和C++中,你可以只建立一个指向第一个元素的指针。
我遇到的问题:给定一个循环链表,实现一个算法,返回循环开始处的节点。

我认为您需要一个深度优先搜索来回答这个问题。一般来说,下面是这类问题:

a = [1,2,3]
b = [4,5,6]
a[1] = b
b[2] = a

def is_list(l):
    try:
        it = iter(l)
        return l
    except TypeError:
        return None

def dfs(a, colors):
    l = is_list(a)
    print 'is_list:', l
    if l:
        if colors.has_key(id(l)):
            print 'cycle detected'
            return l
        colors[id(l)] = ''
        for ll in l:
            dfs(ll, colors)

colors = {}
dfs(a, colors)

循环链表没有真正的开始和结束。但是从您的评论来看,我认为您希望在循环列表时检测何时到达开始使用的元素

#The structure of ListNode
class ListNode:
  def __init__(self, val):
    self.val = val
    self.next = None

# Supposes you have a circular linked list and you have a reference to head. You can do as follows to print the whole list. 
current = head.next
while current != head: # stop when it comes back to head
  print current.val
  current = current.next

也许我遗漏了一些东西,但循环难道不意味着第一的概念是完全对称的,因此有点无意义吗?当然,我想您可以实现一个数据元素来确定哪个节点是头部。通常的情况应该是:给定一个对单链接列表中某个节点的引用,找到一个圆(如果有的话),从给定的引用中首先到达其中的节点,该引用可能指圆圈外的节点。低级数据结构链表与高级Python列表数据结构没有直接关系。CPython可能在内部使用链表,但这与Python语言中的链表完全不同,后者更像一个动态数组。那么,你所说的循环列表到底是什么意思?你能举个例子吗?@inspectorG4dget:如果你遍历这个列表,它是你将遇到两次的第一个元素。“它定义得很好。@KarolyHorvath:但这对你在圈中的起始位置非常敏感。”。因此,结果不稳定且不可重复。这是不正确的。假设列表链接回第一个元素。@KarolyHorvath根据循环链表的定义。它不是一个带循环的链表,而是一个循环链表。OP说的是——那么,在遍历整个循环链表并返回起始位置后,如何找到特定的第一个节点,或是同一个节点呢。在爪哇和C++中,你可以建立一个指向第一个元素的指针。