線形連結リストはノードのセットです。ノードは次のように定義されます (わかりやすくするために、ノードとリストを区別しません)。
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;....
}
}
リストのディープコピーを作成できます。ここで、リストを反転して、最初のノードが最後になり、最後が最初になるようにします。インバーテッド リストはディープ コピーである必要があります。
反転機能の開発を開始しましたが、よくわかりません。何か案は?
更新:線形リンクリストは再帰的なデータ構造であるため、再帰的な方法があるかもしれません。
最初の要素を取得し、子を持たないノードに到達するまでリストを繰り返し処理し、最初の要素を追加します。これを 2 番目、3 番目の要素について繰り返します....