java class 如何使用它自己的引用类型
How a java class works with it's own reference type
我对 JAVA 和 OOP 还很陌生,我目前正在学习一门学术课程,我正在学习 java 中的数据结构和算法。
当我学习链表的实现时,我 运行 遇到了一个小问题,即不理解代码如何在实现链表时创建节点(我熟悉构造函数和位递归)。
节点class的代码如下
public class Node {
public int info;
public Node next, prev;
public Node (int el) {
this (el,null,null);
}
public Node (int el,Node n,Node p){
info = el; next =n; prev=p;
}
}
我想知道代码执行时的幕后情况(尤其是第3行的工作原理),列表class的代码如下
public class List {
private Node head, tail;
public List ( ){
head = tail = null;
}
public boolean isEmpty( ){
return head == null;
}
public void addToTail (int el) {
if (!isEmpty ( )) {
tail = new Node (el, null, tail);
tail.prev.next = tail;
}
else head = tail = new Node(el);
}
public int removeFromTail ( ){
int el = tail.info;
if (head == tail)
head = tail =null;
else
{
tail = tail.prev; tail.next = null;
}
return el;
}
}
(这个例子是我学习的学院给的,我想知道它是如何工作的)
请解释 节点 class 是如何工作的。
我需要知道代码执行时幕后发生了什么(尤其是line3是如何工作的)。
请解释节点 class 的工作原理。
public Node next, prev;
Java 引用对象类型的变量是 引用 ,而不是值。字段 next
和 prev
不是 Node 对象。没有 Node
对象包含其他节点。相反,next
和 prev
引用单独存储的 Node
对象。
如果您来自 C 或 C++,您可以将这些引用看作有点像指针。
编辑:
如果您问的是一般链表的构造,您的节点 class 表示双向链表中的单个节点,包含单个项目。在双向链表中,每个节点都指向前一个节点和后一个节点。
在这篇相关的维基百科文章中查看 illustration of a doubly linked list。
List
就像一列火车。一个Node
就像火车上的车厢。链接是节点之间的引用,类似于火车车厢之间的耦合。您询问的next
和prev
字段是节点之间的链接。
从逻辑上讲,List 包含整个火车。从物理上讲,您的 List 引用了火车的头部和尾部,因此它可以从前到后或从后到前穿过节点。
假设您的代码的入口点是调用:
List list = new List();
list.addToTail(1);
list.addToTail(2);
list.removeFromTail();
第一行代码将构造函数执行到列表class中,它只是将head和tail设置为null。
第二行代码添加addToTail方法,将变量head和tail设置为new Node(1),调用Node中只有一个参数的构造函数class.
第三行代码添加了addToTail方法,但是这次列表不是空的,所以脚本在if语句中输入了你用Node(2, null, tail)保存的节点。如果您使用三个参数检查此 Node 构造函数,tail(您在其之前添加的值为 1 的节点)将被设置为与当前节点关联的 prev(前一个)节点。
最后一行代码删除第二个节点,代码为tail = tail.prev; tail.next = 空;和 return 您刚刚删除的元素。
好的,让我们从 Node
Class
开始
public Node next, prev;
public Node (int el) {
this (el,null,null);
}
这里的对象 next
和 prev
是对当前节点的下一个和上一个节点的引用(这是您的当前对象 (this))
this (el,null,null);
这意味着您正在创建一个没有上一个或下一个节点的节点。当您传递 null 时,下一个和上一个为 null。它类似于创建头部,因为头部没有下一个和上一个节点。
当您创建头部时,您将永远不会更改它,但是当您在列表中创建第二个元素时,您将更改下一个头部
创建链表的尾部时
public void addToTail (int el) {
if (!isEmpty ( )) {
tail = new Node (el, null, tail);
tail.prev.next = tail;
}
else head = tail = new Node(el);
}
这里先通过tail = new Node (el, null, tail);
创建尾节点
然后通过执行 tail.prev.next = tail;
获取 tail 的前一个并将 prev 的下一个元素设置为尾部
每次您将新节点添加到您正在调用的列表中时,addToTail(int e1)
会更新尾部并更新旧尾部的下一个节点。
首先是 java 中的节点,它是一种特定类型的变量,它可以完成变量的正常工作,并有其他信息允许她指向另一个节点,在你的情况下是 public Node next, prev;
通常在列表中使用节点,像火车一样思考这就是为什么你在这里有 addtootail
或 removefromtail
。
在此 link 中,您会找到关于此的相当详尽的解释。
http://www.vias.org/javacourse/chap14_02.html
节点 class 封装数据,在本例中是一个名为 info
.
的整数值
此外,List
实现为 Nodes
的序列。
next
和 prev
值在 Node
中的原因是节点可以链接到列表序列中的上一个和下一个节点。访问列表中节点的唯一方法是遍历列表,使用 next
引用向前,或者使用 prev
引用向后。
请注意,列表不像数组那样支持随机访问。要到达某个元素,您需要沿某个方向遍历列表。
我对 JAVA 和 OOP 还很陌生,我目前正在学习一门学术课程,我正在学习 java 中的数据结构和算法。
当我学习链表的实现时,我 运行 遇到了一个小问题,即不理解代码如何在实现链表时创建节点(我熟悉构造函数和位递归)。
节点class的代码如下
public class Node {
public int info;
public Node next, prev;
public Node (int el) {
this (el,null,null);
}
public Node (int el,Node n,Node p){
info = el; next =n; prev=p;
}
}
我想知道代码执行时的幕后情况(尤其是第3行的工作原理),列表class的代码如下
public class List {
private Node head, tail;
public List ( ){
head = tail = null;
}
public boolean isEmpty( ){
return head == null;
}
public void addToTail (int el) {
if (!isEmpty ( )) {
tail = new Node (el, null, tail);
tail.prev.next = tail;
}
else head = tail = new Node(el);
}
public int removeFromTail ( ){
int el = tail.info;
if (head == tail)
head = tail =null;
else
{
tail = tail.prev; tail.next = null;
}
return el;
}
}
(这个例子是我学习的学院给的,我想知道它是如何工作的)
请解释 节点 class 是如何工作的。
我需要知道代码执行时幕后发生了什么(尤其是line3是如何工作的)。
请解释节点 class 的工作原理。
public Node next, prev;
Java 引用对象类型的变量是 引用 ,而不是值。字段 next
和 prev
不是 Node 对象。没有 Node
对象包含其他节点。相反,next
和 prev
引用单独存储的 Node
对象。
如果您来自 C 或 C++,您可以将这些引用看作有点像指针。
编辑:
如果您问的是一般链表的构造,您的节点 class 表示双向链表中的单个节点,包含单个项目。在双向链表中,每个节点都指向前一个节点和后一个节点。
在这篇相关的维基百科文章中查看 illustration of a doubly linked list。
List
就像一列火车。一个Node
就像火车上的车厢。链接是节点之间的引用,类似于火车车厢之间的耦合。您询问的next
和prev
字段是节点之间的链接。
从逻辑上讲,List 包含整个火车。从物理上讲,您的 List 引用了火车的头部和尾部,因此它可以从前到后或从后到前穿过节点。
假设您的代码的入口点是调用:
List list = new List();
list.addToTail(1);
list.addToTail(2);
list.removeFromTail();
第一行代码将构造函数执行到列表class中,它只是将head和tail设置为null。
第二行代码添加addToTail方法,将变量head和tail设置为new Node(1),调用Node中只有一个参数的构造函数class.
第三行代码添加了addToTail方法,但是这次列表不是空的,所以脚本在if语句中输入了你用Node(2, null, tail)保存的节点。如果您使用三个参数检查此 Node 构造函数,tail(您在其之前添加的值为 1 的节点)将被设置为与当前节点关联的 prev(前一个)节点。
最后一行代码删除第二个节点,代码为tail = tail.prev; tail.next = 空;和 return 您刚刚删除的元素。
好的,让我们从 Node
Class
public Node next, prev;
public Node (int el) {
this (el,null,null);
}
这里的对象 next
和 prev
是对当前节点的下一个和上一个节点的引用(这是您的当前对象 (this))
this (el,null,null);
这意味着您正在创建一个没有上一个或下一个节点的节点。当您传递 null 时,下一个和上一个为 null。它类似于创建头部,因为头部没有下一个和上一个节点。
当您创建头部时,您将永远不会更改它,但是当您在列表中创建第二个元素时,您将更改下一个头部
创建链表的尾部时
public void addToTail (int el) {
if (!isEmpty ( )) {
tail = new Node (el, null, tail);
tail.prev.next = tail;
}
else head = tail = new Node(el);
}
这里先通过tail = new Node (el, null, tail);
创建尾节点
然后通过执行 tail.prev.next = tail;
每次您将新节点添加到您正在调用的列表中时,addToTail(int e1)
会更新尾部并更新旧尾部的下一个节点。
首先是 java 中的节点,它是一种特定类型的变量,它可以完成变量的正常工作,并有其他信息允许她指向另一个节点,在你的情况下是 public Node next, prev;
通常在列表中使用节点,像火车一样思考这就是为什么你在这里有 addtootail
或 removefromtail
。
在此 link 中,您会找到关于此的相当详尽的解释。
http://www.vias.org/javacourse/chap14_02.html
节点 class 封装数据,在本例中是一个名为 info
.
此外,List
实现为 Nodes
的序列。
next
和 prev
值在 Node
中的原因是节点可以链接到列表序列中的上一个和下一个节点。访问列表中节点的唯一方法是遍历列表,使用 next
引用向前,或者使用 prev
引用向后。
请注意,列表不像数组那样支持随机访问。要到达某个元素,您需要沿某个方向遍历列表。