2

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

它不会通过这种方法反转链表,但是当我在 left_tmp = @head 之后添加 @ head.next = nil,它就可以正常工作。

当我添加它时,我无法弄清楚为什么它会起作用,有人有解释吗?

顺便说一句,我对 ruby​​ 还很陌生,所以请不要犹豫,告诉我是否还有其他一些不是“ 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

当您反转 alinked list时,第一个节点成为最后一个节点。在 asingly-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
于 2012-05-05T07:55:02.250 回答