我有以下课程:
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类)。但是,我担心如何创建一个循环链表(最后一个元素的下一个元素将指向第一个元素)。
我应该如何修改此实现以便能够这样做?
答案 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