软件设计与数据结构

Chapter 4 Linked Chains, Bags Continued

| 关于   «  1. 测验 1 说明   ::   目录   ::   3. 链表  »

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. 交互式:结点链式链简介

跟随并参与(Follow Along and Engage)

下载与视频对应的幻灯片。观看视频时在幻灯片上做笔记,并自己动手练习绘制示意图!

IntroToNodes.pptx

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
}

跟随并参与(Follow Along and Engage)

下载与视频对应的幻灯片。观看视频时在幻灯片上做笔记,并自己动手练习绘制示意图!

LinkedChainCode.pdf

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); 不同。

2.9. Contains() 方法动画

跟随并参与(Follow Along and Engage)

下载与视频对应的幻灯片。观看视频时在幻灯片上做笔记,并自己动手练习绘制示意图!

LinkedChainContains.pdf

2.10. 检查点 3

2.11. 指针概念小结

   «  1. 测验 1 说明   ::   目录   ::   3. 链表  »

关闭窗口