gpt4 book ai didi

ruby - 难以理解 Ruby LinkedList 实现中的变量/指针

转载 作者:太空宇宙 更新时间:2023-11-03 16:34:09 25 4
gpt4 key购买 nike

我用 ruby​​ 创建了一个单独的 LinkedList 类。一切顺利,直到尝试反转链表。

它不会通过这种方法反转链表,但是当我添加 @head.next = 无reverse 方法中的 left_tmp = @head 之后,它工作正常。

当我添加它时,我无法弄清楚为什么它会起作用,有人有解释吗?

顺便说一句,我对 ruby​​ 还很陌生,所以如果还有其他一些不是“Good Practice in 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

最佳答案

当您反转链表时,第一个节点成为最后一个节点。在单链表中,最后一个节点的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

关于ruby - 难以理解 Ruby LinkedList 实现中的变量/指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10459904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com