单向java链表_单向链表(单链表)的Java实现

最近被问到链表,是一个朋友和我讨论Java的时候说的。说实话,我学习编程的近一年时间里,学到的东西还是挺少的。语言是学了Java和C#,关于Web的学了一点Html+css+javascript。因为比较偏好,学习WinForm时比较认真,数据库操作也自己有所研究。但链表这个东西我还真没有学习和研究过,加上最近自己在看WPF,而课程也到了JSP了,比较紧。

但是我还是抽了一个晚上加半天的时间看了一下单向链表。并且使用Java试着写了一个实例出来。没有接触过链表的朋友可以作为参考,希望大家多提宝贵意见。

当然,我们首先解释一下什么是链表。就我所知,链表是一种数据结构,和数组同级。比如,Java中我们使用的ArrayList,其实现原理是数组。而LinkedList的实现原理就是链表了。我的老师说,链表在进行循环遍历时效率不高,但是插入和删除时优势明显。那么他有着愈十年的编程经验,我是相信的。不过不知道他是否是说双向链表,我们在此呢只对单向链表做一个了解。

链表(Chain本文所说链表均为单向链表,以下均简称单向链表)实际上是由节点(Node)组成的,一个链表拥有不定数量的节点。而向外暴露的只有一个头节点(Head),我们对链表的所有操作,都是直接或者间接地通过其头节点来进行的。

节点(Node)是由一个需要储存的对象及对下一个节点的引用组成的。也就是说,节点拥有两个成员:储存的对象、对下一个节点的引用。

这样说可能大家不是很明白,我贴一张图大家可能更容易理解。

40c8a1999a50323dd998d4d568cb396e.png

那么大家可能清除了,为什么说有了头节点就可以操作所有节点。因为有着不断的引用嘛!

那么在链表里的属性大概就只有两个了:头节点和节点数量。当然,根据需要,我们通常需要更多的属性。

简单的链表可以写为下面的样子:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值