2016-10-22 148 views
-3
class Node: 
    def __init__(self, item, next): 
     self.item = item 
     self.next = next 

class LinkedList: 
    def __init__(self): 
     self.head = None 

    def add(self, item): 
     self.head = Node(item, self.head) 

    def is_empty(self): 
     return self.head == None 

我試過這樣做,但它不起作用。如何將項目添加到鏈接列表的末尾?

from LinkedList import Node, LinkedList 

def insert_at_end(linked_list, item): 
    linked_list.add(item) 

任何人都可以幫忙嗎?

+0

不,因爲'LinkedList.add()'在開始處添加了一個新節點*。你有沒有嘗試遍歷鏈接到最後並添加一個新的節點? –

+1

每次換頭都不會讓你太過分...... –

+1

@ Jean-FrançoisFabre:其實會。但增加到最後是這裏的問題。 –

回答

2

你需要循環的鏈接列表,並在末尾添加一個新的節點,而不是:

def insert_at_end(linked_list, item): 
    if linked_list.is_empty(): 
     linked_list.add(item) 
    else: 
     node = linked_list.head 
     while node.next is not None: 
      node = node.next 
     node.next = Node(item, None) 

這將重新使用現有的方法在添加一個節點一開始如果鏈接的列表是空的。

演示:

>>> def print_ll(ll): # something to print the list 
...  node = ll.head 
...  while node is not None: 
...   print node.item, 
...   node = node.next 
... 
>>> linked_list = LinkedList() 
>>> insert_at_end(linked_list, 10) 
>>> insert_at_end(linked_list, 42) 
>>> insert_at_end(linked_list, 'foo') 
>>> print_ll(linked_list) 
10 42 foo 
+0

Martijn,我早些時候嘗試過,但它也沒有工作。雖然 – Gabzmann

+0

@Gabzmann:那麼你是如何測試的?你沒有定義什麼*沒有工作*在這裏意味着,所以我不能幫你進一步。以上無疑是正確的方法。 –

+0

@Gabzmann:如果你a)包括你的其他嘗試,b)顯示你的輸入和預期的輸出,並且c)向我們展示發生了什麼(包括任何錯誤),你的問題會大大改善。這就是所謂的[mcve]。 –

0

一種選擇是將__iter__()魔術方法添加到您的LinkedList,使其可迭代:

通過節點
def __iter__(self): 
     current = self.head 
     while current is not None: 
      yield current 
      current = current.next 
     else: 
      raise StopIteration 

現在你可以做迭代添加到尾:

def add_tail(self, item): 
     if self.is_empty(): 
      self.add(item) 
      return 

     # Loop to the end of the list and add the item at the end. 
     for node in self: 
      pass 
     else: 
      node.next = Node(item, node.next) 

加上__iter__()魔法也有您可以使用迭代來構建鏈表的字符串表示形式。通過定義__str__()魔術方法,您可以使用print(my_list)來打印2->3->5之類的東西,如果您定義了__iter__()方法,那麼使用列表理解很容易。

請注意,這實際上與the answer given by @MartijnPieters相同,只是它的形式不同。您仍在循環查看列表,直到完成並在最後添加項目。