【问题标题】:Deep copy of linear linked list线性链表的深拷贝
【发布时间】:2011-06-08 19:33:36
【问题描述】:

我有一个由节点组成的线性链表:

class Node{
    Object data;
    Node link;

    public Node(Object pData, Node pLink){
        this.data = pData;
        this.link = pLink;
    }

    public String toString(){
        if(this.link != null){
            return this.data.toString() + this.link.toString();
        }else{
            return this.data.toString() ;
        }
    }

    public void inc(){
        this.data = new Integer((Integer)this.data + 1);
    }

    public Node copy(){
        return new Node(this.data, this.link.copy());
    }
}

我想制作一个列表的深层副本。然后递增原始列表的每个节点并打印两者。我不知道代码是否正确。

class Aufg1{
    public static void main(String args[]){
        Node node3 = new Node(new Integer(3), null);            
        Node node2 = new Node(new Integer(2), node3);           
        Node node1 = new Node(new Integer(1), node2);
        System.out.println(node1.copy().toString());
        System.out.println(node1.toString());
    }
}

...第二次 println 只给我 123,但副本有问题。有什么想法吗?

更新:

   public Node copy(){
        if(this.link != null){
            return new Node(new Integer((Integer)this.data), this.link.copy());
        }else{
            return new Node(new Integer((Integer)this.data), null);
        }
    }

【问题讨论】:

  • 即使你在做一个深拷贝,也不要创建一个整数的副本。即使是深拷贝也不需要复制不可变对象,因为它们本质上可以安全地共享。另外,如果你知道并依赖 data 是一个整数,为什么不这样声明呢?
  • 谢谢,我把那个整数改了

标签: java linked-list deep-copy


【解决方案1】:

深拷贝意味着您还需要复制数据。

 public Node copy(){
    return new Node(copy of this.data, this.link.copy());
 }

所以你需要决定如何复制对象。

编辑:您可以使用Deep Cloning Library 之类的东西来提供帮助。他们使用反射等。如果您知道自己创建对象类的对象类型,则可以创建一个复制构造函数。

【讨论】:

  • 那么我该如何复制对象?调用克隆()?抱歉,在这种情况下不允许使用深拷贝库,我必须使用基本的 java 方法
  • 我已经用新代码更新了我的问题。是否可以按照代码显示的方式进行深层复制?
【解决方案2】:

好吧,从链接可能为空的事实来看,您可能希望避免在没有先检查的情况下调用 this.link.copy()。我猜你说的问题是空指针异常。

编辑:

是的,正如文森特所说。 :)

一定要复制对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    相关资源
    最近更新 更多