【问题标题】:Having Difficulty to Understand Variables/Pointers on Ruby LinkedList Implementation难以理解 Ruby LinkedList 实现中的变量/指针
【发布时间】:2012-05-05 16:27:59
【问题描述】:

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

这种方法并没有反向链表,但是当我添加 @head.next = 无 在 reverse 方法中 left_tmp = @head 之后,它就可以正常工作了。

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

顺便说一句,我对 ruby​​ 还很陌生,所以请不要犹豫,告诉我是否还有一些不是“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

【问题讨论】:

    标签: ruby linked-list


    【解决方案1】:

    当您反转linked list 时,第一个节点将变为最后一个节点。在singly-linked list 中,最后一个节点的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
    

    【讨论】:

    • 你是对的,但我已经在方法的最后一行更改了@head。在最后一行,left_tmp 指向链表中已经具有 next=nil 值的最后一个。
    • 在最后一行,left_tmp.next 不是nil。因此,第一个节点(在原始链表中)的next pointer 永远不会改变。
    • left_tmp(在最后一行)指向链表中最初的最后一个节点,现在反转后成为第一个节点。 next 指针不再指向 nil。
    • 是的,对不起,我刚刚检查了一下,它不是 nil,但是对于链表 5->4->3->2->1,left_tmp 为 1,其下一个为 2。它应该是什么,对吧?所以当我分配@head=left_tmp 时,我认为一切都应该没问题。
    • 我建议您尝试对您编写的程序进行试运行以最好地理解这一点。问题是您的反向链接列表如下所示: 5 4
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多