在Ruby中实现LinkedList

时间:2016-05-27 16:03:37

标签: ruby linked-list

我试图在Ruby中实现单链接的LinkedList,并且我在尝试弄清楚为什么某些节点正在消失时遇到了一些麻烦。这就是我到目前为止所拥有的:

class Node
  attr_accessor :data, :next
  def initialize(data)
    @data = data
  end
end

class LinkedList
  attr_accessor :head

  def insert(data)
    node = Node.new(data)
    if @head.nil?
      @head = node
    else
      travel = @head
      unless travel.next.nil?
        travel = travel.next
      end
      travel.next = node
    end
    print @head
  end

  def to_string
    result = ""
    travel = @head
    unless travel.nil?
      result << "#{travel.data} => "
      travel = travel.next
    end
    result << "END"
    result
  end

end

这是对这堂课的一次调用:

list = LinkedList.new
list.insert(5)
list.insert(6)
list.insert(7)

在插入结束时,我打印出@head,我可以看到所有三个节点都在列表中。但是,当我单独调用to_string时,@head只有第一个节点,但其他一切都消失了。任何人都能指出我正确的方向指出错误吗?

谢谢!

1 个答案:

答案 0 :(得分:5)

关键字unless存在问题。在ruby中,它是一个条件语句,就像if一样。它不是一个循环。只需使用关键字until替换它们。

关于链接列表一般来说,它的目的是在O(1)中进行插入,而在O(n)中进行插入(遍历列表并在末尾插入节点)。相反,您只需在开头插入新节点即可。

最后,ruby的约定是命名to_string方法to_s,因此在打印列表时会调用它。

此外,您可以将Node作为LinkedList的内部类。如果要实现其他基于节点的数据结构(deque,ring,tree等)

,将非常有用