【问题标题】:Concatenate Python Linked List连接 Python 链表
【发布时间】:2012-02-17 00:09:32
【问题描述】:

我试图在不复制列表节点中包含的数据的情况下连接 Python 链表。我有一个函数将使用传入的节点的副本连接列表,但我似乎无法获得不使用副本工作的函数。

这些函数用于测试和计时目的;我知道 Python 的内置列表很棒!

这是我一直在使用的类和连接函数。

class Cell:
    def __init__( self, data, next = None ):
        self.data = data
        self.next = next

def print_list(self):
    node = self
    while node != None:
        print node.data
        node = node.next

连接函数并不意味着是 Cell 类的成员函数。

def list_concat(A, B):
    while A.next != None:
        A = A.next
    A.next = B      
    return A

如果参数 A 有多个节点,此函数将覆盖列表的第一个元素。我明白为什么会这样,但不知道如何解决它。

这是我一直用于此功能的测试代码。

e = Cell(5)
test = Cell(3, Cell(4))
test2 = list_concat(test2, e)   
test2.print_list()

任何见解或帮助将不胜感激。

*已编辑以修复代码格式

【问题讨论】:

  • 您的串联功能应该可以工作。请注意,list 不是链表。我建议您查看 lisp 实现,因为它们使用与您相同结构的单元。
  • 我认为这个实现应该也可以工作,但是当我打印列表 (test2) 时,它会将元素列为 4 -> 5 -> None,而它应该列出 3 -> 4 -> 5 -> 无。
  • 请注意,在您的代码示例中,您使用 test2 作为参数,然后再分配给它。
  • 这值得做作业标签吗?

标签: python algorithm linked-list


【解决方案1】:

试试这个:

def list_concat(A, B):
    current = A
    while current.next != None:
        current = current.next
    current.next = B
    return A

为函数的参数分配新值是一种不好的编程习惯,您问题中的代码说明了原因:您使用A 迭代原始列表,这样做,您丢失了对其第一个元素的引用.

【讨论】:

  • 另一种可能性是将“查找列表末尾”部分分解为返回最后一个节点的单独函数。然后是list_concat(A, B): find_end(A).next = B; return A
  • 或者,我很惭愧刚刚想到他的,根本不返回列表,就像 Python 的内置 list 类一样。
【解决方案2】:

我不确定extend 是否执行复制,但如果没有,请使用

A.extend(B)

【讨论】:

  • 对不起,我错过了你说你这样做是为了测试目的的部分
猜你喜欢
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 2013-11-15
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
相关资源
最近更新 更多