2017-07-06 7 views
0

リンクリストから最後のノードを取り除くための 'pop'メソッドを作成しました。しかし、私が受け取っている問題は、ノードを削除していないということです。ノード内のデータを削除する必要があるということだけです。Rubyの 'pop'メソッド

私はテスト駆動型開発を使用しています。テストは 'assert_equal "blop"、list.popと書かれています。 "blop"は最後のノードの値です。私に私の方法を教えてもらえれば素晴らしいですが、それでもノードは削除されません。

def pop 
@count -= 1 
return_string = "" 
current_node = @head 
until current_node.next_node == nil 
    current_node = current_node.next_node 
end 
return_string << current_node.data + " " 
return_string.strip 
current_node.next_node = Node.new(data) 
end 

私の質問は、削除されているものの値を返すだけでなく、リンクされたリストから値を削除することです。そのループが終了すると

+0

Rubyでは論理的に間違っているのは 'nil'と' false'だけなので、あなたのリストで文字通り 'false'を期待しているのでなければ、' if current_node.next_node'が表現する方法ですそれ。おそらく 'current_node && = current_node.next_node'を実行することもできます。 – tadman

+0

あなたの質問は何ですか? – sawa

答えて

0
until current_node.next_node == nil 
    current_node = current_node.next_node 
end 

current_nodeは、最後のノード(次のノードが `nilでいるノード)を指しています。

これは削除するノードですが、削除するノードは、前のノードのnext_nodenilにする必要があります。

ただし、その時点で前のノードへの参照はありません。

previousノードを追跡する別の変数を持つことができます。ループを終了するとノードを削除できます。

アルゴリズムに関するアイディアについては、この関連する質問(Ruby特有ではない)をチェックすることができます。サイドノートとして

Linked List implementation for a stack

は、1つの答えの一つが popは、リストの最初のノードを削除(および pushが先頭にノードを追加)が容易になり、作りとしてこれを実装します(とあなたが毎回全体のリストを調べていないので、より速く)。