class Node attr_accessor :value,:next_node def initialize(val,nxt) @value = val @next_node = nxt end end class Stack attr_accessor :data def initialize(d=nil) @data = d end def push(node) node.next_node = @data @data = node end def pop return @data if not @data node = @data @data = @data.next_node return node end end def reverse_nodes(stack) return stack.data end def print_values(node) if node print "#{node.value} --> " print_values(node.next_node) else print "nil\n" end end s = Stack.new ll = Node.new(1,Node.new(2,Node.new(3,nil))) print_values(ll) node = ll while node s.push(node.clone) # because ruby passes by reference! node = node.next_node end print_values(reverse_nodes(s))