2

私はrubyを使用して単一のLinkedListクラスを作成しました。リンクリストを逆にしようとするまで、すべてがうまくいきました。

このメソッドではリンクリストを逆にしませんが 、逆メソッドでleft_tmp =@headの 後に@head.next= nilを追加すると、正常に機能します。

それを追加するとなぜそれが機能するのか理解できませんでしたが、誰か説明がありますか?

ところで、私はルビーにかなり慣れていないので、「Rubyのグッドプラクティス」ではないことが他にあるかどうか、遠慮なく教えてください。

クラスと関連するメソッドは次のとおりです。

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
4

1 に答える 1

1

を反転するlinked listと、最初のノードが最後になります。ではsingly-linked list、最後のノードのnextポインタが を指していnullます。 @head、最初は最初のノードが最後になります。を追加するのはそのためです@head.next = nil

編集:問題をよりよく説明するためのドライランのシミュレート リンクされたリストに2つのノードがあると仮定します:1->2

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

ループの最初の繰り返しwhile:

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 回目の繰り返しはありません。curr == nil

今:

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

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

1 <-> 2
于 2012-05-05T07:55:02.250 に答える