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 引用对象类型的变量是 引用 ,而不是值。字段 nextprev 不是 Node 对象。没有 Node 对象包含其他节点。相反,nextprev 引用单独存储的 Node 对象。

如果您来自 C 或 C++,您可以将这些引用看作有点像指针。

编辑:

如果您问的是一般链表的构造,您的节点 class 表示双向链表中的单个节点,包含单个项目。在双向链表中,每个节点都指向前一个节点和后一个节点。

在这篇相关的维基百科文章中查看 illustration of a doubly linked list

List就像一列火车。一个Node就像火车上的车厢。链接是节点之间的引用,类似于火车车厢之间的耦合。您询问的nextprev字段是节点之间的链接。

从逻辑上讲,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);
    }

这里的对象 nextprev 是对当前节点的下一个和上一个节点的引用(这是您的当前对象 (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;

通常在列表中使用节点,像火车一样思考这就是为什么你在这里有 addtootailremovefromtail 。 在此 link 中,您会找到关于此的相当详尽的解释。 http://www.vias.org/javacourse/chap14_02.html

节点 class 封装数据,在本例中是一个名为 info.

的整数值

此外,List 实现为 Nodes 的序列。

nextprev 值在 Node 中的原因是节点可以链接到列表序列中的上一个和下一个节点。访问列表中节点的唯一方法是遍历列表,使用 next 引用向前,或者使用 prev 引用向后。

请注意,列表不像数组那样支持随机访问。要到达某个元素,您需要沿某个方向遍历列表。