【问题标题】:Modify Calling Object in Ruby在 Ruby 中修改调用对象
【发布时间】:2014-03-19 01:34:08
【问题描述】:

我正在学习 Ruby,作为练习,我正在制作一个链表类。我正在为双向链表编写删除方法。我的问题是,如果我用它的头节点表示列表,我该如何删除头?似乎 Ruby 不允许您分配给 self 变量,所以我不能将调用者的引用更改为下一个节点。一种解决方案是我可以从下一个节点复制密钥并交换引用,但总的来说,Ruby 中有没有办法更改调用者的引用?

class LinkedListNode

    attr_accessor :next, :previous, :key

    def initialize(key=nil, next_node=nil, previous=nil)
        @next = next_node
        @previous = previous
        @key = key
    end

    def append(key=nil)
        newnode = LinkedListNode.new(key)
        seeker = self
        while seeker.next != nil
           seeker = seeker.next
        end
        newnode.previous = seeker
        seeker.next = newnode
     end

     def delete(key=nil)
         seeker = self
         while seeker.key != key
             return if seeker.next == nil
             seeker = seeker.next
         end
         if seeker.previous != nil
            if seeker.next != nil
                seeker.previous.next = seeker.next
                seeker.next.previous = seeker.previous
            else
                seeker.previous.next = nil
            end
         else
             return self = self.next
         end
         return seeker = nil
     end

     def print
         seeker = self
         string = ""
         while 1
            if seeker.next == nil
                string += seeker.key.to_s
                break
            else
                string += seeker.key.to_s + " -> "
            end
            seeker = seeker.next
        end
        puts string
    end
end

if __FILE__ == $0
    ll = LinkedListNode.new(1)
    ll.append(2)
    ll.append(3)
    ll.append(4)
    ll.append(5)

    ll.print

    ll.delete(5)
    ll.print

    ll.delete(1)
    ll.print
end

【问题讨论】:

    标签: ruby linked-list


    【解决方案1】:

    您无法更改调用者指向的对象(即修改self),但您可以按照您已经考虑过的任何方式操作该对象。简短的回答是它无法完成。你可以想出其他方法来建模它,但我认为你已经走上了正确的道路。

    【讨论】:

      【解决方案2】:

      您需要对链表进行不同的概念化。 LinkedListNode 是 LinkedList 的一个组件,而不是 LinkedList 本身。追加、删除和打印等操作应该在您的 LinkedList 类中,而不是在您的 LinkedListNode 类中。尝试从类似的东西开始

      class LinkedList
      
        # This one-liner defines a LinkedList::Node with associated constructor
        # and accessors for the three tags provided.  Any tags omitted during
        # construction will be initialized to nil.
        Node = Struct.new(:key, :previous, :next)
      
        attr_reader :head, :tail
      
        def initialize
          # start with no Nodes in the list
          @head = @tail = nil
        end
      
        def append(key)
          # Make the LinkedList tail a new node that stores the key,
          # points to the prior tail as its previous reference, and
          # has no next.
          @tail = Node.new(key, @tail)
          if @tail.previous  # the prior tail was not nil
            @tail.previous.next = @tail   # make the prior tail point to the new one
          else               # if there wasn't any tail before the list was empty
            @head = @tail    # so the new tail Node is also the head
          end
        end
      
        # ...
      
      end
      

      【讨论】:

        猜你喜欢
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 2019-09-04
        • 2016-12-16
        • 2015-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多