2016-08-16 7 views
-1

これは私のコードです。リンクされたリストの先頭に新しいノードを追加しようとしています。しかし、最初のノードを上書きする必要があります。では、最初のノードを上書きせずに新しいノードを追加する必要があります。 サンプル出力:10 15 20 冒頭に5を追加しようとしています。それは次のようになります:5 15 20 私は5 10 15 20のような出力が必要です。pythonでlinkedlistのbegininningに新しいノードを追加しますか?

def push(self, new_data): 
    new_node = Node(new_data) 
    new_node.next = self.head 
    self.head = new_node 

llist.push(5) 

これがいっぱいのコードです:

class Node: 
    def init__(self, data): 
     self.data = data 
     self.next = None 

class Linkedlist: 
    def __init__(self): 
     self.head = None 
    def printlist(self): 
     temp = self.head 
     while(temp): 
      print temp.data, 
      temp = temp.next 
    def push(self, new_data): 
     new_node = Node(new_data) 
     ew_node.next = self.head 
     self.head = new_node 

if __name == 'main': 
    llist = Linkedlist() 
    llist.head = Node(10) 
    second = Node(15) 
    third = Node(20) 
    llist.push(5) 
    llist.head.next = second 
    second.next = third 
    llist.printlist() 
+0

'llist = 5 + llist'? –

+0

私はあなたに届きません – Dinesh

+0

あなたが聞いたことを理解できませんか? – Dinesh

答えて

2

問題は、あなたのメインプログラムである:

llist.head.next = second 

これは、明示的に第二の要素(値を指すように、リストの頭を設定し、以前の第1ノード(10)を効果的に失う。

ただし、最初のノードを上書きする必要があります。

あなたの質問のこの部分は不明です。あなたの例は反対です。 にする場合は、前の最初のノードであるを置き換えてください。self.head = self.head.nextを実行してから__main__のようにするだけです。しかし、それはあなたの例が示すものではありません。

一方で、あなたが実際に最初のノードの値を上書きしたい場合は、例えば行うことができます:

私はせずに新しいノードを追加する必要がありますどのように
self.head.value = 99 

は、最初のノードを上書き。

pushのコードが正しく表示されます。私はあなたのself.headが間違ったノードを指していると仮定しています。ここであなたのコードは、動作する最小限のリンクリストの実装に埋め込まれています。 @FujiAppleはあなたがListコード外部からリストを修正することは避けるべき指摘しているよう

class Node(object): 
    def __init__(self, value): 
     self.value = value 
     self.next = None 

class List(object): 
    def __init__(self): 
     self.head = None 
    def push(self, new_data): 
     # this is your actual code 
     new_node = Node(new_data) 
     new_node.next = self.head 
     self.head = new_node 
    def push_replace(self, new_data): 
     # replace the previous first node 
     new_node = Node(new_data) 
     new_node.next = self.head.next 
     self.head = new_node 
    def __iter__(self): 
     node = self.head 
     while node: 
      yield node.value 
      node = node.next 

l = List() 
l.push(20) 
l.push(15) 
l.push(10) 
l.push(5) 
list(l) 
=> 
[5, 10, 15, 20] 
# now loose the first item 
l.push_replace(99) 
list(l) 
=> 
[99, 10, 15, 20] 

注:比較のために私はまた、最初の要素を失うpush_replace方法を追加しています。つまり、常にリストの変更を新しいメソッドとして実装します。これにより、リストの仕組みに関する知識がローカライズされ、コードをより安定してデバッグしやすくなります。

0

あなたのコードには、クラスの属性としてではなくすべてのインスタンス間で値が共有されるクラス変数としてheadを使用する必要があります。理解を深めるためにコードを参照してください。ありがとう

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

class Linkedlist: 
    head = None 
    def __init__(self): 
     pass 
    def printlist(self): 
     temp = Linkedlist.head 
     while(temp): 
      print temp.data, 
      temp = temp.next 
    def push(self, new_data): 
     new_node = Node(new_data) 
     new_node.next = Linkedlist.head 
     Linkedlist.head = new_node 

if __name__ == '__main__': 
    llist = Linkedlist() 
    Linkedlist.head = Node(10) 
    second = Node(15) 
    third = Node(20) 
    #llist.push(5) 
    Linkedlist.head.next = second 
    second.next = third 
    llist.printlist() 
    llist.push(5) 
    print '' 
    llist.printlist() 

OUTPUT:

10 15 20 
5 10 15 20 
関連する問題