使用链表实现无序符号表SequentialSearchST

这里的关键问题是理解链表以及链表的循环(遍历)

链表实际上就是一个内部类,而且是一个递归结构。未初始化时,链表本身为null(实际上就是在内存中没有分配空间),其中的next也是链表,也是null。

first = new Node(key, value, first);

Node 链表first就被分配了地址,但是first.next仍然时null;

 1 class Node<Item> {
 2         Item item;
 3         Node next;
 4     }
 5     Node<Integer> first = new Node<>();
 6     Node<Integer> second = new Node<>();
 7     first.item = 1;
 8     second.item = 2;
 9     first.next = second;
10     System.out.println(second);
11     second = first.next;
12     System.out.println(first.next);
13     System.out.println(second);
14 }
15 /*
16 [email protected]
17 [email protected]
18 [email protected]
19 */

从这个测试中可以看出,first.next = second;是给链表结点赋值指向下一个链表结点。second = first.next;是给链表结点赋上结点的值(或为null赋位置址;或改变结点的位置),这个在循环中是关键。

这两者区别是,前者相当于用一个箭头将自己和另一个结点勾连起来,后者相当于将自己直接变成另一个结点。

 1 private Node first;
 2 private class Node {
 3     Key key;
 4     Value value;
 5     Node next;
 6     //构造函数给链表节点初始化(赋值)
 7     public Node(Key key, Value value1, Node next) {
 8         this.key = key; //加this是内部类Node的值,另一个是初始化引入的值,同名所以需要区分
 9         value = value1; //不同名没有冲突(歧义)就可以不加
10         this.next = next;
11     }
12 }
13
14 /*******最重要:插入、获取、删除符号表中的值***********************/
15 public void put(Key key, Value value) {
16     for (Node x = first; x != null; x = x.next) {
17         if (key.equals(x.key)) {
18             x.value = value;
19             return;
20         }
21     }
22     first = new Node(key, value, first);
23 }
24
25 public Value get(Key key) {
26     for (Node x = first; x != null; x = x.next) {
27         if (key.equals(x.key)) {
28             return x.value;
29         }
30     }
31     return null;
32 }

首先注意:

新建的链表结点,都是初始化为null,而且程序运行,第一次运行到给first赋值的时候,first.next仍然是null;

for循环: x = x.next;

理解,等号左右两边的x结点是不一样的,左边就是新的结点,右边的x.next是旧的结点的next,指向下一个结点。这个步骤就是将x按顺序转换到下一个结点,像顺着打了很多结点的绳子一节一节向前走。

注意小脚标。这是代表每次运行时,同一个first有不同的值,注意区分。

时间: 2024-11-01 03:41:46

使用链表实现无序符号表SequentialSearchST的相关文章

Symbol Table(符号表)

一.定义 符号表是一种存储键值对的数据结构并且支持两种操作:将新的键值对插入符号表中(insert):根据给定的键值查找对应的值(search). 二.API 1.无序符号表 几个设计决策: A.泛型 在设计方法时没有指定处理对象,而是使用了泛型. 并且将键(Key)和值(Value)区分开来. B.重复键的处理 规则: 每个值(Value)都只对应一个键(Key)(即不允许存在重复的键). 当用例代码向表中存入的键值对和表中的已有的键(以及关联的值)冲突时,新的值替代旧的值. C.Null 键

算法_符号表

符号表是一种存储键值对的数据结构,支持两种操作:插入(put),即将一组新的键值对存入表中;查找(get):即根据指定的键得到相应的值. 实现的原则: 每个键只对应一个值,表中不允许存在重复的键 当用例代码向表中存入的键值对和表中已有的键(及关联的值)冲突时新的值会替代旧的值. 而对于符号表来说,如果保持键的有序性,可以大大的扩展它的API,根据键的相对位置作出更多有用的操作.这种抽象的数据结构又被称为有序符号表. 可以通过链表来实现无序符号表,代码如下: public class Sequen

《Algorithms 4th Edition》读书笔记——3.1 符号表(Elementary Symbol Tables)-Ⅳ

3.1.4 无序链表中的顺序查找 符号表中使用的数据结构的一个简单选择是链表,每个结点存储一个键值对,如以下代码所示.get()的实现即为遍历链表,用equals()方法比较需被查找的键和每个节点中的键.如果匹配成功我们就返回null.put()的实现也是遍历链表,用equals()方法比较需被查找的键.如果匹配成功我们就用第二个参数指定的值更新和改键现关联的值,否则我们就用给定的键值对创建一个新的节点并将其插入到链表的开头.这种方法也被称为顺序查找:在查找中我们一个一个地顺序遍历符号表中的所有

算法-符号表的实现(顺序查找和二分查找)

符号表是一种存储键值对的数据结构,支持两种操作插入和查找,就是将一组新的键值对存入表中然后根据给定的键得到对应的值,在编程语言中常用Dictionary原理类似.符号表是一种典型的抽象数据结构,在生活之中应用的场景也很多,可以根据钥匙开门,域名解析的时候的IP地址查询,字典和图书的简介和页数,key和value是密不可分的,通过key我们可以很快找到我们需要的value. 无序链表的顺序查找 主要通过Node节点存储数据,之前的博客中有关于链表的实现,详情可参考之前的博客,代码有注释就解释太多了

搜索(1):符号表

符号表的概念 符号表的顺序搜索 1 基于有序数组的符号表 2 基于无序链表的符号表 参考资料 1. 符号表的概念 搜索:我们把处理的数据划分为记录或数据项(item),每个数据项都有一个用于搜索的关键字(key).搜索的目标是找出目标关键字所匹配的数据项.搜索的目的是访问这个数据项(不仅是关键字)中的信息. 符号表:它是一种数据结构,其中数据项含有关键字.它支持两个基本的操作:插入一个新的数据项和搜索返回给定关键字的数据项.(字典) 如何处理符号表中相同关键字? 在符号表的实现中应注意考虑可能楚

浅谈算法和数据结构: 六 符号表及其基本实现

http://www.cnblogs.com/yangecnu/p/Introduce-Symbol-Table-and-Elementary-Implementations.html 浅谈算法和数据结构: 六 符号表及其基本实现 前面几篇文章介绍了基本的排序算法,排序通常是查找的前奏操作.从本文开始介绍基本的查找算法. 在介绍查找算法,首先需要了解符号表这一抽象数据结构,本文首先介绍了什么是符号表,以及这一抽象数据结构的的API,然后介绍了两种简单的符号表的实现方式. 一符号表 在开始介绍查找

2015年 8月21日 符号表及其基本实现

一符号表 在开始介绍查找算法之前,我们需要定义一个名为符号表(Symbol Table)的抽象数据结构,该数据结构类似我们再C#中使用的Dictionary,他是对具有键值对元素的一种抽象,每一个元素都有一个key和value,我们可以往里面添加key,value键值对,也可以根据key来查找value.在现实的生活中,我们经常会遇到各种需要根据key来查找value的情况,比如DNS根据域名查找IP地址,图书馆根据索引号查找图书等等: 为了实现这一功能,我们定义一个抽象数据结构,然后选用合适的

《 常见算法与数据结构》符号表ST(3)——二叉查找树 (附动画)

符号表(3)--二叉查找树 本系列文章主要介绍常用的算法和数据结构的知识,记录的是<Algorithms I/II>课程的内容,采用的是"算法(第4版)"这本红宝书作为学习教材的,语言是java.这本书的名气我不用多说吧?豆瓣评分9.4,我自己也认为是极好的学习算法的书籍. 通过这系列文章,可以加深对数据结构和基本算法的理解(个人认为比学校讲的清晰多了),并加深对java的理解. 符号表3二叉查找树 二叉查找树 1 代码框架 2 节点表示 3 取得操作 4 插入操作 5 动

符号表实现(Symbol Table Implementations)

符号表的实现有很多方式,下面介绍其中的几种. 乱序(未排序)数组实现 这种情况,不需要改变数组,操作就在这个数组上执行.在最坏的情况下插入,搜索,删除时间复杂度为O(n). 有序(已排序)数组实现 这种情况我们就有了排序好的关键字和相应的值. 通过关键字在数组中存储 keys[i]为第i位大的key(关键字) values[i]就是第i位大key对应的值 由于元素是按顺序存储在数组中的,找某个元素就可以用简单的二分搜索.最差的情况,搜索时间复杂度为O(log n),插入和删除时间复杂度为O(n)