我了解数据结构和链接列表,我不了解某些内容。单个对象如何存储这么多地址和数据。当我了解对象时,我发现如果要为单个变量存储许多数据,则需要创建新对象,但现在在Linked List中,newNode对象将存储data1,next1,data2,next2,.... datan ,旁边。
当程序运行list.insert(11)并且数据变为11时,为什么不删除5的旧数据?
对不起我的英语语法,任何反馈都会被贬低。谢谢!
以下代码是关于在链接列表中插入的节点:
节点类:
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());
}
}
Runnner课程:
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();
}
}
答案 0 :(得分:1)
链表本身几乎不知道它包含的数据。它通常只包含总大小的变量和第一个节点的引用, head (以及双链表中的尾部)。
节点是一个自己的对象,它包含数据变量和对下一个节点的引用,它也是一个自己的对象,依此类推。 (在双向链表中,节点也有指向前一节点的指针)
因此,为了访问第五个节点,您需要从头开始并按照下一个指针直到第五个节点。链表中没有直接访问权限。但是,它允许通过重新排列节点的下一个指针来轻松插入或删除元素,例如跳过节点。
另外,请注意,一个对象可容纳多少数据无限制。您完全可以在一个对象中同时保存所有数据。对象的变量也只是对存储实际数据的位置的引用。所以它不需要在内存中彼此相邻,它可以散布在各地。
相反,数组的所有数据都连接在内存中。这就是直接访问适用于数组的原因。你有数组开始的基地址,知道元素的字节大小,并且可以通过它轻松计算内存数据中哪个元素开始的位置:
// Memory address of fifth element of an int[] array
base + 4 * sizeof(int)
这也是他们需要固定尺寸的原因。
答案 1 :(得分:-1)
您的Node类包含数据(int)和对另一个(下一个)Node对象的引用,该对象也将保存数据值。链表类用于构建一个集合,其中每个数据项使用Node类与另一个数据项链接在一起,以便每个数据项单独存储。
如果您只想用新数据更新第一个Node对象,那么您的代码将类似于
Node node = new Node()
node.setData(5)
node.setData(11)
...