Java單鏈表淺拷貝和深拷貝
在Java中,鏈表是一種常見的數(shù)據(jù)結構。在傳遞鏈表實例時,淺拷貝和深拷貝是兩種常見的拷貝方式。
淺拷貝
淺拷貝是指在復制一個對象時,只復制對象本身,而不復制對象所包含的子對象。在拷貝單鏈表時,淺拷貝復制的是鏈表節(jié)點的引用,而不是節(jié)點本身。
public class Node {
int val;
Node next;
public Node(int val) {
this.val = val;
this.next = null;
}
public Node(Node node) { //淺拷貝構造函數(shù)
this.val = node.val;
this.next = node.next;
}
}
在上面的代碼中,可以看到淺拷貝的構造函數(shù)是將拷貝的節(jié)點的值和下一個節(jié)點的引用直接賦給了新節(jié)點。這就導致新節(jié)點和原節(jié)點的下一個節(jié)點是指向同一個對象的。
深拷貝
深拷貝是指在復制一個對象時,不僅復制對象本身,還要復制對象所包含的子對象。在拷貝單鏈表時,深拷貝要手動復制節(jié)點和下一個節(jié)點。
public class Node {
int val;
Node next;
public Node(int val) {
this.val = val;
this.next = null;
}
public Node(Node node) { //深拷貝構造函數(shù)
this.val = node.val;
if(node.next != null)
this.next = new Node(node.next);
}
}
在上面的代碼中,可以看到深拷貝的構造函數(shù)是新建一個節(jié)點,將原節(jié)點的值賦給新節(jié)點,然后判斷原節(jié)點的下一個節(jié)點是否為空,如果不為空則新建一個節(jié)點賦給新節(jié)點的下一個節(jié)點。
總結
單鏈表淺拷貝和深拷貝的主要區(qū)別在于節(jié)點的引用是否被復制。淺拷貝復制的是節(jié)點的引用,而深拷貝是復制節(jié)點本身。需要根據(jù)不同的需求來選擇拷貝方式。