【问题标题】:Circular list detection in Python?Python中的循环列表检测?
【发布时间】:2014-10-25 20:14:50
【问题描述】:

有没有办法在 Python 中检测循环列表的第一个元素?在 Java 和 C++ 中,您可以只建立一个指向第一个元素的指针。

我遇到的问题:给定一个循环链表,实现一个算法,返回循环开始时的节点。

【问题讨论】:

  • 也许我遗漏了一些东西,但循环不是意味着“第一”的概念是完全对称的,因此有点毫无意义吗?当然,我猜你可以实现一个数据元素来确定哪个节点是“头”
  • 习惯的情况应该是:给定一个单链表的一个节点的引用,找到一个圆,如果有的话,从给定的引用中最先到达的节点(可能指一个节点圈外)。
  • 低级数据结构 链表 与高级 Python list 数据结构不(直接)相关。 CPython 可能在内部使用链表,但这与 Python 语言中的 list 完全不同(更像是动态数组)。那么“循环列表”到底是什么意思?能举个例子吗?
  • @inspectorG4dget:如果您遍历列表,它是您将遇到两次的第一个元素。它定义明确。
  • @KarolyHorvath:但这对你从圈子的哪个位置开始非常敏感。因此,结果不稳定且不可重现

标签: python algorithm linked-list circular-list


【解决方案1】:

循环链表没有真正的开始和结束。但是从您的评论中,我认为您想检测何时到达您开始使用的元素,同时遍历列表。

#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

【讨论】:

  • 这是不正确的。您假设列表链接回 first 元素。
  • @KarolyHorvath 由循环链表定义。 en.wikipedia.org/wiki/… 不是带循环的链表,是循环链表。
  • OP 说的 - “那么你如何找到特定的 FIRST 节点,或者在遍历整个循环列表并返回起始位置后再次找到相同的节点”。另外 - “在 Java 和 C++ 中,您可以只建立一个指向第一个元素的指针。”
【解决方案2】:

我认为您需要进行深度优先搜索才能笼统地回答这个问题,这是这样的:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2011-12-04
    相关资源
    最近更新 更多