2016-10-22 19 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

1つのオプションは、それが反復可能にするために、あなたのLinkedListに__iter__()マジックメソッドを追加することです:

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__()マジックメソッドを定義することにより、2->3->5のようなものを印刷するにはprint(my_list)を使用することができます。__iter__()メソッドが定義されている場合は、リストの理解が非常に簡単です。

これは実際にはthe answer given by @MartijnPietersと同じですが、別の形式になっています。あなたが最後に到達し、最後に項目を追加するまで、あなたはまだリストをループしています。

関連する問題