将值插入Ruby中的链表

时间:2019-01-18 22:11:33

标签: ruby linked-list

我在Ruby中使用链接列表时遇到麻烦。在方法insert_node中,如果head不是nil,则current_node.next = _node将在链表的末尾插入要插入的值。我不知道如何使用添加到链接列表末尾的值来更新head。在我看来,current_nodehead的副本,然后在直到循环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)

1 个答案:

答案 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_headhead = new_head