簡體   English   中英

Java,做一個參考指向另一個參考

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM