难以理解Ruby链接列表实现中的变量/指针

时间:2012-05-05 07:41:50

标签: ruby linked-list

我用ruby创建了一个单独的LinkedList类。 一切顺利,直到试图扭转链表。

它不会通过此方法反转linkedlist,但是当我添加时      @ head.next = nil 反向方法中 left_tmp = @head 之后,它就可以了。

当我添加它时,我无法弄清楚为什么它有效,是否有人有解释?

BTW我对红宝石很新,所以请不要犹豫告诉我是否还有其他一些不是“ 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

1 个答案:

答案 0 :(得分:1)

当您倒转linked list时,第一个节点成为最后一个节点。在singly-linked list中,最后一个节点的next指针指向null@head,最初是您的第一个节点成为最后一个节点。这就是你添加@head.next = nil

的原因

编辑:模拟干运行以更好地解释问题 假设链表中有两个节点: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)

curr == nil

以来没有第二次迭代

现在:

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

最终链表状态为:

1 <-> 2