2012-01-23 167 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