我用ruby创建了一个单独的LinkedList类。 一切顺利,直到试图扭转链表。
它不会通过此方法反转linkedlist,但是当我添加时 @ head.next = nil 在反向方法中 left_tmp = @head 之后,它就可以了。
当我添加它时,我无法弄清楚为什么它有效,是否有人有解释?
BTW我对红宝石很新,所以请不要犹豫告诉我是否还有其他一些不是“ Ruby的良好实践”。以下是课程和相关方法:
class LlNode
attr_reader :data
attr_accessor :next
def initialize(val=nil)
@data = val
@next = nil
end
def to_s
"node_data=#{@data}"
end
end
class LinkedList
def initialize
@list = []
@head = LlNode.new
end
def insert(val)
n = LlNode.new val
# List is empty
if is_empty?
@head = n
else
n.next = @head
@head = n
end
self
end
def reverse
return if is_empty? or @head.next.nil?
curr = @head.next
right_tmp = curr.next
left_tmp = @head
while curr != nil
curr.next = left_tmp
left_tmp = curr
curr = right_tmp
right_tmp = right_tmp.next unless right_tmp.nil?
end
@head = left_tmp
end
end
答案 0 :(得分:1)
当您倒转linked list
时,第一个节点成为最后一个节点。在singly-linked list
中,最后一个节点的next
指针指向null
。 @head
,最初是您的第一个节点成为最后一个节点。这就是你添加@head.next = nil
。
编辑:模拟干运行以更好地解释问题
假设链表中有两个节点:1->2
curr = @head.next (2)
right_tmp = curr.next (nil)
left_tmp = @head (1)
while
循环的第一次迭代:
curr.next = left_tmp ( 1 <-> 2)
left_tmp = curr (2)
curr = right_tmp (nil)
right_tmp = right_tmp.next unless right_tmp.nil? (nil)
自curr == nil
现在:
@head = left_tmp (@head points to '2')
最终链表状态为:
1 <-> 2