[英]Java, make a reference point to another reference
在 Java (或任何 OOP 語言)中,我可以制作一個嵌套的 class “節點”,它代表一些包含 63311CBD4B666AC9 數據的 ZA8ZFDE63311CBD59EB6666 的嵌套 class“節點”。 然后我可以用名為“head”的變量聲明一個“節點”引用:
public class ListNode {
class Node {
int value;
Node next = null;
public Node(int value) {
this.value=value;
}
}
Node head;
}
然后我可以做類似的事情:
head = new Node(42);
...這應該使“頭”引用指向一個 int 值為 42 的新節點 object,並且其中的引用指向 null:
但是我怎樣才能真正做出另一個指向“頭”引用的引用呢? 我認為它不可能,但它看起來像這樣:
我知道如果我再做一個參考,比如Node another_ref;
然后執行another_ref = head
,所有將發生的事情是another_ref
將指向任何 head 指向(在這種情況下包含 42 的節點),所以我將留下 2 個指向節點 object 的引用,其 int 值 = 42,和指向 null 的節點下一個引用。
我知道我可以獲取head.next
的引用,它是指向 null 的 Node 對象的引用,我可以通過執行head.next = head;
將其指向自身。 ,但似乎我無法得到任何指向Node head
引用的東西。
我在這里錯過了什么嗎? 你不能像這樣將參考“鏈接”或“鏈接”在一起嗎? 顯然,我可以創建一堆具有各種 integer 值的new Nodes(integer values...)
以鏈接到一個鏈表,但只是對此感到好奇。
在C++中,可以有指針指向指針; Java 中沒有這個。 你可以模擬它:
假設您有以下 Ref 模板界面:
public interface Ref<T> {
T get();
void set(T newValue);
}
您的Node
class 可能具有返回對其next
字段的引用的方法:
public Ref<Node> getRefToNext() {
return new Ref<Node>(){
@Override
public Node get() {
return next;
}
@Override
public void set(Node newValue) {
next = newValue;
}
};
}
並且 class ListNode
可以有一個方法返回對其head
字段的引用:
public Ref<Node> getRefToHead() {
return new Ref<Node>(){
@Override
public Node get() {
return head;
}
@Override
public void set(Node newValue) {
head = newValue;
}
};
}
現在,如果您想編寫一個插入新節點同時保持列表排序的方法,您可以執行以下操作:
public void insert(int value) {
Ref<Node> ref = getRefToHead();
Node node;
while ((node = ref.get()) != null && value < node.value) {
ref = node.getRefToNext();
}
Node newNode = new Node(value);
newNode.next = node;
ref.set(newNode);
}
但當然,它比使用 C++ 指針要慢得多。
更新
它允許您重用通用代碼:假設您定義了一個locate
方法,如下所示:
private Ref<Node> locate(int value) {
Ref<Node> ref = getRefToHead();
Node node;
while ((node = ref.get()) != null && value < node.value) {
ref = node.getRefToNext();
}
return ref;
}
您可以使用它來查找節點:
public Node find(int value) {
return locate(value).get();
}
並插入一個新節點:
public void insert(int value) {
Ref<Node> ref = locate(value);
Node newNode = new Node(value);
newNode.next = ref.get();
ref.set(newNode);
}
同樣的原理也可以用於二叉樹。
了解您要實現的目標會很有幫助。 如果您嘗試創建指向彼此的節點序列,則很容易實現:
public class Node {
private int value;
private Node next;
public Node(int value) {
this(value, null);
}
public Node(int value, Node next) {
this.value = value;
this.next = next;
}
public int value() {
return value;
}
public Node next() {
return next;
}
}
在這種情況下,class 不需要嵌套,但可以是它自己文件的一部分,順便說一句。
從技術上講是做不到的。 正如用戶@Turing85 所指出的那樣
要按照您的意願進行操作,您必須在新實例中傳遞該 object。 但從技術上講,它不會是這樣的參考,它將是一個新的 object。
在這篇文章中,他們通過參考資料很好地解釋了這一點。 https://stackoverflow.com/a/2806564/11532975
我希望我有所幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.