我正在使用堆栈实现反向链表。
类Stack
具有方法push
和pop
,它们将链接列表转换为堆栈,从中可以提取最后一个元素以反转顺序。
我遇到了类似情况here,我试图在该基本案例中添加方法。我正在尝试实施reverse_list
方法,该方法利用Stack
类push
和pop
来更改指针并反转链表。
这就是我的尝试:
class LinkedListNode
attr_accessor :value, :next_node
def initialize(value, next_node=nil)
@value = value
@next_node = next_node
end
end
def print_values(list_node)
if list_node
print "#{list_node.value} --> "
print_values(list_node.next_node)
else
print "nil\n"
return
end
end
class Stack
attr_reader :data
def initialize
@data = nil
end
def push(value)
@data = LinkedListNode.new(value, @data)
end
def pop
return nil if @data.nil?
returning_value = @data.value
@data = @data.next_element
returning_value
end
end
def reverse_list(list)
stack = Stack.new.push(list.value)
list = list.next_node
while list
stack.push(list.value)
list = list.next_node
end
stack.pop
end
node1 = LinkedListNode.new(37)
node2 = LinkedListNode.new(99, node1)
node3 = LinkedListNode.new(12, node2)
revlist = reverse_list(node3)
print_values(revlist)
# should return 37 --> 99 --> 12 --> nil
在Stack
方法(reverse_list
)中调用undefined method push for <Context::LinkedListNode:0x00000001c5e0a8>
课程时出错。
我不知道为什么我无法在Stack
内使用push
,pop
和reverse_list
。关于如何实施reverse_list
的任何提示都会受到欢迎。
答案 0 :(得分:2)
以下内容将元素推入堆栈,然后将其反转:
def reverse_list(list)
stack = Stack.new
while list
stack.push(list.value)
list = list.next_node
end
LinkedListNode.new(stack.pop, stack.data)
end
答案 1 :(得分:1)
stack = Stack.new.push(list.value)
在您的示例中,变量stack
是LinkedListNode
的实例,因为push
方法正在返回链接列表的实例。所以没有抛出方法错误。您必须首先创建Stack
的实例,如stack = Stack.new
,它将成为空堆栈,然后使用此实例进行推送和弹出操作。
答案 2 :(得分:0)
您的Stack类中的pop方法正在调用“ next_element”,但是我认为您应该从LinkedListNode类中引用“ next_node”变量。我会用这种方式重写您的“ pop”方法:
def pop
if @data.nil?
nil
else
returning_value = @data.value
@data = @data.next_node
returning_value
end
end
我也将重写方法来反向链接列表,如下所示:
def reversed_linked_list(list)
stack = Stack.new
while list
stack.push(list.value)
list = list.next_node
end
LinkedListNode.new(stack.pop, stack.data)
end
答案 3 :(得分:-1)
遍历列表,将其内容添加到堆栈,直到列表末尾。之后,可以应用以下算法。
root = stack.pop() # last element
current = root
while not stack.empty(): # move in reverse direction
current.next = stack.pop() # next element in stack is the next node
current = current.next # continue to the next node
current.next = nil # mark end of the list