Java 链表-单个对象如何一个接一个地存储这么多地址?
我了解数据结构和链表,但我不懂一些东西。单个对象如何存储如此多的地址和数据。当我了解对象时,我发现如果要为单个变量存储多个数据,就需要创建新对象,但现在在链表中,newNode对象将存储data1、next1、data2、next2等,。。。。达坦,下一个 当程序运行list.insert(11)且数据变为11时,为什么不删除5的旧数据 对不起,我的英语语法,任何反馈都将不胜感激。谢谢大家! 以下代码是关于在链接列表中插入节点的代码: 节点类:Java 链表-单个对象如何一个接一个地存储这么多地址?,java,data-structures,linked-list,Java,Data Structures,Linked List,我了解数据结构和链表,但我不懂一些东西。单个对象如何存储如此多的地址和数据。当我了解对象时,我发现如果要为单个变量存储多个数据,就需要创建新对象,但现在在链表中,newNode对象将存储data1、next1、data2、next2等,。。。。达坦,下一个 当程序运行list.insert(11)且数据变为11时,为什么不删除5的旧数据 对不起,我的英语语法,任何反馈都将不胜感激。谢谢大家! 以下代码是关于在链接列表中插入节点的代码: 节点类: public class Node {
public class Node {
int data;
Node next;
public int getData() {
return data;
}
public Node getNext() {
return next;
}
public void setData(int data) {
this.data = data;
}
public void setNext(Node next) {
this.next = next;
}
}
MyLinkedList类:
public class MyLinkedList {
Node head;
public void insert(int data) {
Node newNode = new Node();
newNode.setData(data);
newNode.setNext(null);
if (head == null) {
head = newNode;
}
else {
Node n = head;
while(n.getNext() != null) {
n = n.getNext();
}
n.setNext(newNode);
}
}
public void show() {
Node newNode = head;
while (newNode.getNext() != null) {
System.out.println(newNode.getData());
newNode = newNode.getNext();
}
System.out.println(newNode.getData());
}
}
public class Runner {
public static void main(String args[]) {
MyLinkedList list = new MyLinkedList();
list.insert(5);
list.insert(11);
list.insert(9);
list.insert(3);
list.show();
}
}
Runnner类:
public class MyLinkedList {
Node head;
public void insert(int data) {
Node newNode = new Node();
newNode.setData(data);
newNode.setNext(null);
if (head == null) {
head = newNode;
}
else {
Node n = head;
while(n.getNext() != null) {
n = n.getNext();
}
n.setNext(newNode);
}
}
public void show() {
Node newNode = head;
while (newNode.getNext() != null) {
System.out.println(newNode.getData());
newNode = newNode.getNext();
}
System.out.println(newNode.getData());
}
}
public class Runner {
public static void main(String args[]) {
MyLinkedList list = new MyLinkedList();
list.insert(5);
list.insert(11);
list.insert(9);
list.insert(3);
list.show();
}
}
链表本身几乎不知道它所包含的数据。它通常只保存总大小的变量和对第一个节点头的引用(在双链接列表中也是对尾部的引用) 节点是一个自有对象,它包含一个数据变量和对下一个节点的引用,该节点也是自有对象,依此类推。(在双链接列表中,节点也具有指向上一个节点的指针) 因此,为了访问第五个节点,您需要从头部开始,按照下一个指针到达第五个节点。链接列表中没有直接访问权限。但是,它允许通过重新安排节点的下一个指针(例如跳过节点)轻松插入或删除元素 另外,请注意,一个对象可以保存的数据量没有限制。您完全可以在一个对象中同时保存所有数据。此外,对象的变量只是对实际数据存储位置的引用。因此,它不需要在内存中彼此相邻,它可以分散在各地 相反,数组的所有数据都连接在内存中。这就是为什么直接访问可以很好地与阵列配合使用。您有数组开始的基址,知道元素的字节大小,并且可以轻松地计算元素开始的内存数据中的位置:
// Memory address of fifth element of an int[] array
base + 4 * sizeof(int)
这也是它们需要具有固定大小的原因。否。节点包含单个数据元素。但它有一个对另一个节点的引用,该节点包含另一个数据元素,并且也有对另一个节点的引用。“猫王”指的是你,而且只指你。但如果我问你“谁是你的父亲”,你就可以告诉我“老猫王”。然后我可以问老猫王“谁是你的父亲”,他会回答“约翰·巴尔”,等等。“猫王”是一个人,但通过这个人,通过反复询问父亲(或母亲,或邻居等),我可以接触到许多其他人。谢谢你的解释!在创建新节点时,旧节点不是被删除了吗?我认为有一个单独的对象存储数据1,next1,然后当创建数据2,next2时,旧的数据1,next1被删除。当创建对象Node3时,对象Node2没有被删除(通过Grbage集合),因为Node1指向它。我理解正确吗?每个数据项都有一个节点对象。
LinkedList
对象的唯一用途是保存对第一个节点对象和元数据的引用。删除节点只需跳过即可隐式工作(请参见图)。垃圾收集器将最终删除跳过的节点,因为没有人再引用它。垃圾收集器只删除不再引用的对象。因此,只要每个节点都被某个对象引用,它们就不会被删除。