簡體   English   中英

Java鏈接列表,創建無名節點

[英]java- linked lists, creating nameless nodes

我的問題也許太簡單了:也許這就是我沒有找到書面答案的原因。 我試圖了解鏈接列表的構建方式,但有一件我無法理解的事情:通常,當我創建某種類的對象時,需要給它起一個名字,例如:

 cat kitten =new cat();

在執行此操作的同時,計算機會為其提供一個地址,例如dfe @ fggv3444。 當我想以某種方法使用創建的對象時,我用我給它的名稱來解決它:在我們的例子中是“ cat”。 邏輯是,如果我用相同的名稱“ cat”命名2個對象,則計算機將不知道要訪問哪個對象,或者可能都不知道。 現在的問題是:當我們使用鏈表時,整個程序中使用的節點數變化很大。 那么節點類類型的對象如何獲得其名稱? 顯然他們必須有一個名字,但是我不在那里給每個節點起名字...

這個怎么運作?!

提前致謝。 我確定這個問題中的某些內容一定很愚蠢,但無法弄清楚是什么。

每個cat名稱本質上(如注釋中的@ Turing85所指出的)只是人類可讀格式的貓實例的內存地址。

鏈表的核心是一組節點,每個節點都有一個valuenext節點( next是將節點連接起來以形成列表的變量)。 每只貓將簡稱為node.value ,其中value是指向節點貓的地址的“名稱”。 每個節點的next變量指向具有自己的value的下一個節點。

您不能在同一范圍內為相同的對象命名-您可以使cat1cat2都屬於cat類型,並且每個都指向不同cat的內存地址。 鏈表之所以能夠做到這一點,是因為每個節點都有自己的作用域,而其他節點看不到。 因此,所有節點都可以有一個next和一個value ,稱為node.nextnode.value

      node1        +--------> node2        +--------> node3
+--------------+   |    +--------------+   |    +--------------+
| value = cat1*|   |    | value = cat2 |   |    | value = cat3 |
| next = node2-|---+    | next = node3-|---+    | next = null  |
+--------------+        +--------------+        +--------------+

*---> cat1
+--------------+
| name = "tom" |
| col = "grey" |  ...and likewise for the other nodes
| ............ |

Java實例化此對象時,Java有一個用於鏈接列表的內置類java.util.LinkedList

LinkedList<Node> list = new LinkedList<Node>();

您正在創建引用 ,或者在您的情況下, 名稱為對象(您的鏈接列表)的“列表”

整個列表都有一個名稱“列表”,可以作為遍歷的起點。 鏈表中的每個節點都沒有“名稱”。 在Java中,您可以遍歷列表,有點類似於數組。 通過索引。

list.get(someIndex)

此方法基本上遍歷列表,直到someIndex,然后返回那里的節點。 您可以通過手動為該節點設置名稱。

Node node = list.get(someIndex)

但是通常,它們沒有“名稱”,而是可以通過它們的索引或許多其他方法來訪問它們。

檢查https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html,以獲取有關內置類的更多詳細信息

在鏈表中,每個元素都由節點表示。 這些節點通過它們在內存中的地址保留其他元素。 這可能是偽名稱,但實際上,這只是表示其在內存中的位置的一種方式。

可能使您感到困惑的是,您沒有像在此代碼中那樣直接定義對象。

Animal cow = new Animal();

在這種情況下,我們在變量cow分配了新對象數據的地址。 這使我們可以輕松訪問它。

與此相反,鏈表節點對象保留下一個節點的地址,但與其他任何對象一樣,它們只是該節點的屬性而被包含。

您不能在相同的可見性范圍內為Java中的任何兩個變量賦予相同的名稱(而這兩個變量仍然存在,並且不會被Java垃圾收集器丟棄。)更多信息: http : //www.oracle.com/webfolder/ technetwork / tutorials / obe / java / gc0​​1 / index.html ),否則編譯器將不知道您所指的是哪個值或對象。

要回答問題的第二部分,只要對象具有引用 (訪問該對象的方式)就存在。 您應該理解,很顯然,必須訪問添加到鏈接列表的對象。 假設第一個節點名為head,並且您必須在鏈接列表中找到對第三個節點的引用。 head.next.next將是對鏈表中第三個節點的引用,它不一定必須具有“ head”之類的名稱,但只要有引用就將存在。

希望這能回答您的問題!

變量名僅出於可讀性。 Java編譯器將源代碼轉換為“機器可讀”代碼,其中不包含變量名。 值存儲在具有特定地址的內存中,例如十六進制的0x00000000

每個節點包含一個值和下一個節點的內存地址。 調用cat.next(); ,您的計算機將獲取下一個節點的地址而不是變量名,並且它知道該地址在哪里。

注意:

  1. 值也可以存儲在寄存器,高速緩存或磁盤中。 他們還引用數據地址。
  2. Java LinkedList實際上是雙重鏈接的,其中每個節點也包含其先前節點的地址。 為了簡化起見,我們在這里使用單鏈表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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