2011-01-11 11 views
1

最初のノードからのカウントとしてリスト内の場所にあるノードを削除するdelete_node関数を作成したいとします。リンクされたリストからのノードの削除

class node: 
    def __init__(self): 
     self.data = None # contains the data 
     self.next = None # contains the reference to the next node 

class linked_list: 
    def __init__(self): 
     self.cur_node = None 

    def add_node(self, data): 
     new_node = node() # create a new node 
     new_node.data = data 
     new_node.next = self.cur_node # link the new node to the 'previous' node. 
     self.cur_node = new_node # set the current node to the new one. 

    def list_print(self): 
     node = ll.cur_node 
     while node: 
      print node.data 
      node = node.next 
    def delete_node(self,location): 
     node = ll.cur_node 
     count = 0 
     while count != location: 
      node = node.next 
      count+=1 
     delete node 


ll = linked_list() 
ll.add_node(1) 
ll.add_node(2) 
ll.add_node(3) 

ll.list_print() 
+1

ご質問ありがとうございます。具体的な質問をStackOverflowにお願いしてください。ちょうど私たちにいくつかのコードを書いて、「ここに私がしたいことがある」と言わないでください。たとえば、あなたはどんな問題に取り組んでいますか? – Amber

+0

さて、私はこのアルゴリズムをC++で理解しています。問題はどうしたらノードオブジェクトを削除できますか?基本的にnew_nodeを作成することの反対 – pandoragami

+0

@lost_with_coding「C++で」アルゴリズムを理解していれば、そのアルゴリズムを理解できません。あなたはC++でそれを実装する方法を知っています。アルゴリズムを理解していれば、Pythonの構文について特定の質問をするでしょう。 – aaronasterling

答えて

9

Pythonであなたがすべきではない、文字通りdeleteノード:これまでのところ、これは私が持っているコードです。ノードを指しているものが何もない(正確にはPythonでは何も参照していない)と、最終的に仮想マシンによって破壊されます。

nノードであり、それは.nextフィールドがある場合、その後:

n.next = n.next.next 

を効果代わりn.next.nextn点の.nextフィールドを作り、n.nextを破棄する。 nが削除したいノードの前のノードの場合は、これはPythonで削除されます。

[P.S.最後の段落はちょっと混乱するかもしれません。紙に書いておくと分かります。

+0

意味があります。私はこれを試してみる。 – pandoragami

0

Pythonのリストのリンクリストです。

thelist = [1, 2, 3] 
# delete the second 
del thelist[2] 
+0

はい、リンクリストをPythonでビルドする必要はありません。それらはすでに言語コアで提供されています。 – Ber

+0

Pythonリストは_not_リンクリストです。具体的には、次の要素に進む方法がなくインデックス可能です。 – aaronasterling

+0

i = iter(thelist); i.next(); i.next(); el3 = thelist [3] – Keith

3

これは1つの方法です。

def delete_node(self,location): 
    if location == 0: 
     try: 
      self.cur_node = cur_node.next 
     except AttributeError: 
      # The list is only one element long 
      self.cur_node = None 
     finally: 
      return 

    node = self.cur_node   
    try: 
     for _ in xrange(location): 
      node = node.next 
    except AttributeError: 
     # the list isn't long enough 
     raise ValueError("List does not have index {0}".format(location)) 

    try: 
     node.next = node.next.next # Taken from Eli Bendersky's answer. 
    except AttributeError: 
     # The desired node is the last one. 
     node.next = None 

あなたが本当にdelを使用していない(と私は戻ってきて、再びそれを見てまで、これはここに私をトリップ)の理由は、それがないすべては、それが上と呼ばれていることを、その特定の参照を削除していることです。オブジェクトは削除されません。 CPythonでは、オブジェクトへの参照がなくなるとすぐにオブジェクトが削除されます。我々は削除し、前のノードのnext属性れnodeという名前の1:何が

del node 

実行されることをここに起こる、ノードへの(少なくとも)2つの基準があります。前のノードはそれを依然として参照しているため、実際のオブジェクトは削除されず、リストにはまったく変更は生じません。

+0

この後にどのように2つの半分を接続しますか? – Keith

+0

@Keithあなたは、彼が書いたことを読んではいません。「それも後にすべてのノードを削除するので、私はこのトリミングを実際に呼び出すでしょう。 – pandoragami

+0

@lostしかし、元の質問だったリストからノードを削除することと同じではありません。したがって、これは実際には有効な答えではありません。もう少しコードが必要です。 – Keith

1
def remove(self,data): 
current = self.head; 
previous = None; 
while current is not None: 
    if current.data == data: 
    # if this is the first node (head) 
    if previous is not None: 
     previous.nextNode = current.nextNode 
    else: 
     self.head = current.nextNode 
    previous = current 
    current = current.nextNode; 
+0

このコードは質問に答えるかもしれませんが、どのようにして問題を解決するか、そして/または理由を解決するための追加のコンテキストを提供することで、回答の長期的価値が向上します。質の高い回答を提供するためには、この[how-to-answer](http://stackoverflow.com/help/how-to-answer)をお読みください。 – thewaywewere

0

リンクリストは、1つの以上のノードを持っていると仮定します。 n1-> n2-> n3のように、del n2したいとします。あなたが頭でデルN1、にしたい場合は

n1.next = n1.next.next 
n2.next = None 

head = n1.next 
n1.next = None 
関連する問題