2012-05-05 5 views
2

私はRubyで単独のLinkedListクラスを作成しました。 リンクされたリストを逆転しようとするまでうまくいった。Ruby LinkedList実装で変数/ポインタを理解するのが難しい

それは、この方法でのLinkedListを逆転しませんが、私はそれだけで正常に動作left_tmp = @headで逆方法、後head.next = nilの @ を追加するとき。

私はそれを追加したときになぜ機能するのか分かりませんでした。誰か説明がありますか?

私はかなり新しいルビーですので、「グッドプラクティスルビー」以外のものがあるかどうか私に教えてください。

class LlNode 
    attr_reader :data 
    attr_accessor :next 

    def initialize(val=nil) 
    @data = val 
    @next = nil 
    end 

    def to_s 
    "node_data=#{@data}" 
    end 
end 

class LinkedList 
    def initialize 
    @list = [] 
    @head = LlNode.new 
    end 

    def insert(val) 
    n = LlNode.new val 
    # List is empty 
    if is_empty? 
     @head = n 
    else 
     n.next = @head 
     @head = n 
    end 
    self 
    end 

    def reverse 
    return if is_empty? or @head.next.nil? 

    curr = @head.next 
    right_tmp = curr.next 
    left_tmp = @head 

    while curr != nil 
     curr.next = left_tmp 
     left_tmp = curr 
     curr = right_tmp 
     right_tmp = right_tmp.next unless right_tmp.nil? 
    end 
    @head = left_tmp 
    end 
end 

答えて

1

あなたがlinked listを反転している、最初のノードが最後に次のようになります。ここでは

はクラスと関連するメソッドです。 singly-linked listでは、最後のノードのnextポインターはnullを指しています。最初は最初のノードである@headが最後になります。そのため、@head.next = nilを追加するのはこのためです。

編集whileループの1->2

curr = @head.next (2) 
right_tmp = curr.next (nil) 
left_tmp = @head (1) 

最初の反復:あり

curr.next = left_tmp (1 <-> 2) 
left_tmp = curr  (2) 
curr = right_tmp (nil) 
right_tmp = right_tmp.next unless right_tmp.nil? (nil) 

より良いリンクリスト内の2つのノードを想定 問題を説明するためにドライランをシミュレーション以来2回目の繰り返しはありませんcurr == nil

今:

@head = left_tmp (@head points to '2') 

最終的なリンクリストの状態は次のとおりです。

1 <-> 2 
+0

あなたが正しいですが、私はすでにメソッドの最後の行で@head変更します。最後の行では、left_tmpはリンクされたリストの中で最後にnext = nilの値を指しています。 – tackleberry

+0

最後の行では、 'left_tmp.next'は' nil'ではありません。したがって、(元のリンクされたリスト内の)第1のノードの「次のポインタ」は決して変更されない。 –

+0

'left_tmp'(最後の行)は、元々リンクリストの最後のノードを指し、逆転時に最初のノードになりました。 'next'ポインタはもはや' nil'を指していません。 –

関連する問題