我是个新手。请原谅我问这么简单的问题。
虽然我知道Ruby不包含LinkedList类,所以我们需要创建自己的,因此我创建了自己的类,如下所示:
class Node
attr_accessor :data, :next
def initialize(data, next_node = nil)
@data = data
@next = next_node
end
end
class Linkedlist
def empty?
@head == nil
end
def size
count = 0
if self.empty?
return count
else
current_node = @head
while current_node.next !=nil
count += 1
current_node = current_node.next
end
return count
end
end
...
...
def add
if self.empty?
@head = Node.new(data)
else
while current_node.next != nil
current_node = current_node.next
end
current_node.next = Node.new(data)
end
end
end
我对size
调用的实现清楚地显示了O(n)
的时间复杂度。当查看这个answer中的Java
实现时,似乎Java
跟踪linked list
的大小,使得大小调用的时间复杂度为O(1)
。
如何使用ruby
实现这一点?
2条答案
按热度按时间g0czyy6m1#
您的
size
实现具有O(n)
的复杂性,因为它在计算size
时迭代了整个列表。相反,您可以将当前
size
存储在一个示例变量中,并在添加新节点时递增该变量。当前大小存储在示例变量中。size
方法将在O(1)
中返回。当你实现一个
remove
方法时,该方法需要递减@size
变量。注意:我重新格式化并重写了一些代码,以遵循常见的Ruby习惯用法。
yfwxisqw2#
将
attr_accessor :size
添加到Class Linkedlist
中,并在add
方法中操作size
,如下所示: