如何反转LinkedList到位

时间:2016-01-03 19:17:10

标签: ruby linked-list singly-linked-list

更新:我现在意识到我的问题应该是:如何通过REFERENCE传递参数?我在这里有一个线索:'pass parameter by reference' in Ruby?但如果可能的话,我也不知道。事实上可能值得关闭这个问题。

参考上一个问题:How to reverse a linked list in Ruby

我有点困惑为什么列表没有被反转。

所以我的期望是: print_values(node3)

最初会给: 12 -> 99 -> 37 -> nil

然后我打电话给:reverse_list(node3)

我希望拨打print_values(node3)37 -> 99 -> 12 -> nil

但是,我得到12 -> nil

在某种程度上这是有道理的,因为node3引用的对象仍然具有12的值并且next_node为nil,但有没有办法在Ruby中完全反转列表?

这里似乎有一些关于w / r / t红宝石的可变性,我并不是很抓。它好像每次添加内存堆栈/函数调用时都会得到新对象吗?这里的一些澄清将非常感激。

我还创建了自己的方法来尝试使功能正常运行:

def reverse_list(list, previous=nil)

    rest_of_list = list.next_node
    print "rest of list: "
    print_values(rest_of_list)
    list.next_node = previous
    previous = list
    print "new previous: "
    print_values(previous)  
    list = rest_of_list
    print "new list: "
    print_values(list)
    if list.nil?
        print "list now nil\n"
        list = previous
        print "updated list: "
        print_values(list)
        return list
    else
        reverse_list(list, previous)
    end
end

2 个答案:

答案 0 :(得分:1)

回答您的最新问题:

是的,您必须撤消列表的,而不是指针。

要执行此操作AFAIK,您必须先构建一个新的反转列表,然后将反转的值复制回原始列表。

我已经将原始代码更新为更多ruby-ish(即方法是列表类的一部分,并且"!"后缀用于指示方法将修改对象(而不是而不只是返回一个新值。)



<script type="text/ruby">
def print(s)
  s = s.gsub("\n", "<br/>").gsub(" ", "&nbsp;")
  Element['#output'].html = Element['#output'].html + s
end

class LinkedListNode
  attr_accessor :value, :next_node

  def initialize(value, next_node=nil)
    @value = value
    @next_node = next_node
  end
 
  def reverse_list(reversed=nil)
    if next_node
      next_node.reverse_list(LinkedListNode.new(value, reversed))
    else
      LinkedListNode.new(value, reversed)
    end
  end
  
  def reverse_list!(list=self, reversed_list = reverse_list)
    self.value = reversed_list.value
    if next_node
      next_node.reverse_list!(list, reversed_list.next_node)
    else
      list
    end
  end
  
  def print_values
    print "[#{object_id}]#{value} --> "
    if next_node.nil?
      print "nil\n"
    else
      next_node.print_values
    end
  end
 
end

node1 = LinkedListNode.new(37)
node2 = LinkedListNode.new(99, node1)
node3 = LinkedListNode.new(12, node2)
print "original list:     "
node3.print_values
print "reversed list:     "
node3.reverse_list.print_values
print "reversed in place: "
node3.reverse_list!
node3.print_values

</script>


<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://rawgit.com/reactrb/reactrb-express/master/reactrb-express.js"></script>
<div id="output" style="font-family: courier"></div>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

Ruby中没有通过引用传递

除了最基本的类(例如数字)之外的所有类,有一些方法可以修改对象,从而完成了通过引用调用的大部分功能。