我在Ruby中使用链接列表时遇到麻烦。在方法insert_node
中,如果head
不是nil
,则current_node.next = _node
将在链表的末尾插入要插入的值。我不知道如何使用添加到链接列表末尾的值来更新head
。在我看来,current_node
是head
的副本,然后在直到循环current_node.next
之后才得到要插入的值。只是看了一下,我认为head
将是相同的先前链接列表,并且假定head不是nil
,就没有附加值。
class Node
attr_accessor :data, :next
def initialize(data)
@data = data
@next = nil
end
end
class List
def insert_node(head, value)
_node = Node.new(value)
if head.nil?
return _node
end
current_node = head
until current_node.next.nil?
current_node = current_node.next
end
current_node.next = _node
head
end
def display(head)
temp = head
while temp
print "#{temp.data} "
temp = temp.next
end
end
end
obj = List.new
head = nil
head = obj.insert_node(head, 1)
head = obj.insert_node(head, 2)
obj.display(head)
答案 0 :(得分:3)
insert
之所以起作用,是因为current_node.next = _node
是对head
所指向的列表中对象的永久修改。调用之后,即使current_node
被垃圾回收了(它只是一个临时指针),它在current_node.next = _node
行中指向的节点的.next
属性也被永久修改了。
下面是将新节点3
添加到列表1->2->nil
的图:
(before the `until` loop)
+---------+ +---------+
| data: 1 | | data: 2 |
| next: ----> | next: ----> [nil]
+---------+ +---------+
^ ^
| |
head current_node
(after the `until` loop; `current_node.next == nil`)
(and before `current_node.next = _node`)
+---------+ +---------+
| data: 1 | | data: 2 |
| next: ----> | next: ----> [nil]
+---------+ +---------+
^ ^
| |
head current_node
(after `current_node.next = _node`)
+---------+ +---------+ +---------+
| data: 1 | | data: 2 | | data: 3 |
| next: ----> | next: ----> | next: ----> [nil]
+---------+ +---------+ +---------+
^ ^
| |
head current_node
顺便说一下,这种insert
方法的设计很差;每次插入都是O(n)线性时间操作,需要遍历整个列表。改进的LinkedList
类设计将提供一个tail
指针,从而允许O(1)恒定时间插入到列表的末尾。或者,该类可以提供add_front()
而没有尾部指针,这将设置new_head.next = old_head
和head = new_head
。