如何在Ruby中使用这种方法创建循环链表?

时间:2014-08-21 03:47:15

标签: ruby

我有以下课程:

class Node
  attr_accessor :data, :next

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

class LinkedList
  def initialize(items)
    @head = Node.new(items.shift)
    items.inject(@head) {|last, data| last.next = Node.new(data) }
  end
end

所以我可以通过这样做来获得LinkedLists:

ll = LinkedList.new([1,2,3,4])

我发现这种方法非常干净(具有包装多个Node对象的LinkedList类)。但是,我担心如何创建一个循环链表(最后一个元素的下一个元素将指向第一个元素)。

我应该如何修改此实现以便能够这样做?

1 个答案:

答案 0 :(得分:3)

只需存储当前“下一个”节点,因为它在inject proc之外创建,覆盖前一个节点,这样当你完成inject时,你就可以获得实际的最后一个节点在列表中。然后将其next@head相关联。

def initialize(items)
  @head = Node.new(items.shift)
  items.inject(@head) {|last, data| @last = last.next = Node.new(data) }
  @last.next = @head
end