最近被问到链表,是一个朋友和我讨论Java的时候说的。说实话,我学习编程的近一年时间里,学到的东西还是挺少的。语言是学了Java和C#,关于Web的学了一点Html+css+javascript。因为比较偏好,学习WinForm时比较认真,数据库操作也自己有所研究。但链表这个东西我还真没有学习和研究过,加上最近自己在看WPF,而课程也到了JSP了,比较紧。
但是我还是抽了一个晚上加半天的时间看了一下单向链表。并且使用Java试着写了一个实例出来。没有接触过链表的朋友可以作为参考,希望大家多提宝贵意见。
当然,我们首先解释一下什么是链表。就我所知,链表是一种数据结构,和数组同级。比如,Java中我们使用的ArrayList,其实现原理是数组。而LinkedList的实现原理就是链表了。我的老师说,链表在进行循环遍历时效率不高,但是插入和删除时优势明显。那么他有着愈十年的编程经验,我是相信的。不过不知道他是否是说双向链表,我们在此呢只对单向链表做一个了解。
链表(Chain本文所说链表均为单向链表,以下均简称单向链表)实际上是由节点(Node)组成的,一个链表拥有不定数量的节点。而向外暴露的只有一个头节点(Head),我们对链表的所有操作,都是直接或者间接地通过其头节点来进行的。
节点(Node)是由一个需要储存的对象及对下一个节点的引用组成的。也就是说,节点拥有两个成员:储存的对象、对下一个节点的引用。
这样说可能大家不是很明白,我贴一张图大家可能更容易理解。
那么大家可能清除了,为什么说有了头节点就可以操作所有节点。因为有着不断的引用嘛!
那么在链表里的属性大概就只有两个了:头节点和节点数量。当然,根据需要,我们通常需要更多的属性。
简单的链表可以写为下面的样子:
1 packagemyChain;2
3 /**
4 * (单向)链表5 *6 *@authorJohness7 */
8 public classPersonChain {9 private PersonChainNode head; //头节点
10 private int size; //链表的实体(即节点的数量)
11 private int modCount; //链表被操作的次数(备用)
12
13 /**
14 * 获得链表中节点数量15 *16 *@return链表中节点数17 */
18 public intgetSize() {19 return this.size;20 }21
22 /**
23 * 添加节点的一般方法24 *25 *@paramp26 * 添加到链表节点的对象 由于实现细节,作为唯一标识,同一个编号的Person只能添加一次27 */
28 public voidaddNode(Person p) {29 if (!contains(p.personNo)) { //如果链表中没有该对象,则准备添加
30 if (head != null) { //如果有头节点,则添加新节点作为头节点
31 head = newPersonChainNode((myChain.Person) p, head);32 size++;33 modCount++;34 } else { //如果没有头节点,则添加对象作为头节点
35 head = new PersonChainNode((myChain.Person) p, null);36 size++;37 modCount++;38 }39 }40 }41 }
以上的代码就是一般链表的骨架了。拥有两个重要属性。
那么做为能添加到链表的节点又该长什么样子呢?
我们可以写作如下:
1 packagemyChain;2