2012-01-23 170 views
4

我试图连接一个Python链接列表而不复制包含在列表节点中的数据。我有一个函数将使用传入的节点的副本连接列表,但似乎无法获得不使用副本的函数。连接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() 

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

*编辑,以修复代码格式化

+0

你的拼接功能应该工作。请注意'list'不是一个链表。我建议你看看lisp的实现,因为他们使用与你一样的结构的单元。 – Marcin

+0

我认为这个实现应该可以工作,但是当我打印列表(test2)时,它列出了4 - > 5 - > None的元素,当它列出3 - > 4 - > 5 - > None时。 –

+0

请注意,在您的代码示例中,在分配给它之前,您正在使用test2作为参数。 – Marcin

回答

5

试试这个:

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

分配新值函数的参数是一个不好的编程习惯,并在你的问题的代码说明了为什么:你以前A用于迭代原始列表,并且通过这样做,您失去了对其第一个元素的引用。

+1

另一种可能性是将“找到列表的末尾”部分分解为一个单独的函数,该函数返回最后一个节点。然后它是'list_concat(A,B):find_end(A).next = B;返回A' – kindall

+1

或者,我很惭愧地想到他,*根本不像Python的内置'list'类那样返回列表。 – kindall

0

我不知道关于是否extend执行复制或没有,但如果没有,只是用

A.extend(B) 
+0

对不起,我错过了你说你正在做这个测试目的的部分 – Chris