使用堆栈反转ruby中的链表

时间:2016-04-30 04:45:52

标签: ruby algorithm linked-list

我正在使用堆栈实现反向链表。 类Stack具有方法pushpop,它们将链接列表转换为堆栈,从中可以提取最后一个元素以反转顺序。

我遇到了类似情况here,我试图在该基本案例中添加方法。我正在尝试实施reverse_list方法,该方法利用Stackpushpop来更改指针并反转链表。

这就是我的尝试:

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内使用pushpopreverse_list。关于如何实施reverse_list的任何提示都会受到欢迎。

4 个答案:

答案 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)

在您的示例中,变量stackLinkedListNode的实例,因为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