2. 链式链(指针)¶
2.1. 目标¶
完成本模块后,学生将能够:
复习引用变量的概念
理解结点链式链的特征和用途
实现链式链及其相关方法
遍历链式链
跟踪链式链方法的执行
比较基于数组的实现与链式链实现
练习链式链的操作
2.1.1. 致谢¶
本页的部分文字与图片最初来自斯坦福大学 Nick Parlante 撰写的一篇文档,并经作者许可使用: "Pointers and Memory",作者 Nick Parlante,版权所有 1998-2000,斯坦福 CS 教育图书馆(Stanford CS Education Library)。
2.2. 引用变量¶
Java 使用指针(pointer)概念的受限版本,称为引用(reference)。虽然二者含义大致相同,但"指针"一词通常用于不特指任何特定语言或实现的讨论中。"指针"一词蕴含了 C/C++ 中把指针实现为内存地址或位置的常见做法。引用只能"指向"一个对象。这意味着程序员使用引用时的访问权限更加有限。虽然这限制了程序员能做的事情,但 Java 的设计理念认为,代码正确运行的概率因此大大提高,这足以弥补上述限制。Java 程序员只能为引用赋值,以及比较两个引用是否相等。引用的其他用法都隐式完成,程序员无法控制。这些限制降低了出错的可能性。
两个指向同一个对象的引用被称为"共享"(sharing)。有时我们称二者互为别名(alias),因为通过任一名字都能引用所指向的对象。两个或多个引用能够协同共享同一个内存结构,这是引用的一个关键优势,其中任何一个引用都能修改对象的值。
2.3. 交互式:结点链式链简介¶
2.4. 检查点 1¶
2.5. 编程练习:链式链 1¶
指针编程练习提示(Pointer Programming Exercise Tips)
Link 类不提供 getter 或 setter,请直接与字段交互来访问或修改它们
Link 类提供的构造函数接收两个参数:data 和 next。要实例化一个值为 “Hello”、next 字段为 null 的新 Link 结点:
Link myLink = new Link("Hello", null);双引号表示参数是 String,单引号表示参数是 char 或 Character。因此,
new Link("A", null);与new Link(‘A’, null);不同。
2.6. 交互式:可视化器中的演示¶
LinkedChain 类示例(LinkedChain Class Example)
可以将以下代码粘贴到课程幻灯片中链接所指的可视化器中运行:
package linkedchain;
public class LinkedChain {
private Node head; // Reference to first node
private int numberOfEntries;
public static void main(String[] args) {
LinkedChain chain = new LinkedChain();
chain.add(10);
chain.add(-2);
chain.add(57);
}
public LinkedChain() {
head = null;
numberOfEntries = 0;
} // end default constructor
public void add(int newEntry) {
// Add to beginning of chain:
Node newNode = new Node(newEntry);
newNode.next = head; // Make new node reference rest of chain
head = newNode; // New node is at beginning of chain
numberOfEntries++;
} // end add
private class Node {
private int data;
private Node next; // Link to next node
private Node(int dataPortion) {
this(dataPortion, null);
} // end constructor
private Node(int dataPortion, Node nextNode) {
data = dataPortion;
next = nextNode;
} // end constructor
} // end Node
}
2.7. 检查点 2¶
2.8. 编程练习:链式链 2¶
指针编程练习提示(Pointer Programming Exercise Tips)
Link 类不提供 getter 或 setter,请直接与字段交互来访问或修改它们
Link 类提供的构造函数接收两个参数:data 和 next。要实例化一个值为 “Hello”、next 字段为 null 的新 Link 结点:
Link myLink = new Link("Hello", null);双引号表示参数是 String,单引号表示参数是 char 或 Character。因此,
new Link("A", null);与new Link(‘A’, null);不同。
