【发布时间】:2011-06-08 19:57:44
【问题描述】:
线性链表是一组节点。这就是节点的定义方式(为方便起见,我们不区分节点和列表):
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 void lappend(Node list){
Node child = this.link;
while(child != null){
child = child.link;
}
child.link = list;
}
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);
}
}
public Node invert(){
Node child = this.link;
while(child != null){
child = child.link;
}
child.link = this;....
}
}
我能够制作列表的深层副本。现在我想反转列表,以便第一个节点是最后一个,最后一个是第一个。倒排列表必须是深拷贝。
我开始开发反转功能,但我不确定。有什么想法吗?
更新:也许有一种递归方式,因为线性链表是一种递归数据结构。
我会获取第一个元素,遍历列表直到我到达一个没有子节点的节点并附加第一个元素,我会在第二个,第三个重复这个......
【问题讨论】:
-
如果需要双向遍历,可以双链表。
-
如果你在 stackoverflow 中搜索“反向链表”这个短语,你会发现很多答案,其中一些是在 Java 中。
-
我认为递归虽然是一种非常酷的思考方式(如果您试图扩展您对问题的思考方式,这绝对是好的),但没有必要。沿着堆栈和队列的思路思考。:)
-
@skaffman deep-copy 不适用于反转集合/列表。在最好的情况下,它可以被视为浅拷贝。
标签: java algorithm linked-list deep-copy