java数据结构之单向链表(一)
前言
~说点题外话,刚进入工作,感觉还是挺累的,除去工作时间,还要抽取出一部分时间来进行学习,确实不容易呐,但没办法,既然选择这个行业,就只有不断学习来提升自己。
言归正传,这一小节主要是用java代码来实现一个简单的链表。
1 链表概述
1.1 链表是什么?
古代由于科技的限制,但为了记录下曾经的重大事件,想出了一种方式,结绳记事。每当发生一件重大事情的时候就会在绳子上打上一个节点,久而久之,这个绳子就变成了一个储存事件的工具。这里的链表和结绳记事的原理是差不多的。
在阐述链表之前,先说下节点。节点分为两部分,一部分用来存储数据(data域),另一部分用来指向下一个节点(next域)。
将这些节点拼接起来就变成了一个链表,有头(data域)有尾(next域)。
1.2 链表和普通的存储数据的方式有什么不同呢?
普通的数据存储,每一个数据都是独立的,没有关联,而这里的链表则是将相邻的两个数据进行关联,从而形成链表。
2 链表的具体实现
2.1 代码的准备
~用java代码简单的实现链表的功能(不实现排序)
2.11 准备一个数据类
(1)data域:用来存放数据
(2)next域:用来指向向下一个节点
2.12 准备一个链表类
(1)用来做链表的初始化工作
(2)准备一个头结点(不存放数据,只用来指向下一个节点)
(2)能够实现链表的添加以及展示功能
3 上代码进行演示
package com.haiyi.linkedlist;
public class SingleLinkedListDemo {
//进行测试
public static void main(String[] args) {
//创建节点
HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");
HeroNode heroNode2 = new HeroNode(2, "卢俊义", "玉麒麟");
HeroNode heroNode3 = new HeroNode(3, "吴用", "智多星");
HeroNode heroNode4 = new HeroNode(4, "林冲", "豹子头");
//创建链表
SingleLinkedList linkedList = new SingleLinkedList();
linkedList.add(heroNode1);
linkedList.add(heroNode2);
linkedList.add(heroNode3);
linkedList.add(heroNode4);
linkedList.list();
}
}
//链表
class SingleLinkedList {
// 带有头结点的链表
// 创建一个头结点,不用来存放数据,用来指向下一个
public HeroNode head = new HeroNode(0, "", "");
// 添加节点(要添加链表的最后)
public void add(HeroNode node) {
// 先判断链表是不是最后,根据next 是否为空进行判断
HeroNode temp = head;
// 对链表进行遍历,添加到链表的最后
while (true) {
// 是链表最后一个直接指向这个节点
if (temp.next == null) {
break;
}
// 不是链表最后一个,移动到下一个
temp = temp.next;
}
temp.next = node;
}
// 遍历链表
public void list() {
// 除去第一个节点后,用来判断链表是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}
// 遍历除去头结点之后的节点
HeroNode temp = head.next;
while (true) {
// 节点为空直接结束
if (temp == null) {
break;
}
// 节点不为空,在进行输出
System.out.println(temp);
// 将节点后移,在进行判断
temp = temp.next;
}
}
}
//定义一个 节点
class HeroNode {
// data域用来存放数据
public int no;
public String name;
public String nickName;
// 相当于next域(指向下一个节点)
public HeroNode next;
public HeroNode(int no, String name, String nickName) {
super();
this.no = no;
this.name = name;
this.nickName = nickName;
}
@Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + ", nickName=" + nickName + "]";
}
}
4 演示结果
5 小结
(1)这一小结,主要是为了熟悉链表的概念,以及存储数据的方式,在接下来的几个章节中,我会对链表做详细的介绍。
(2)不足之处希望大家指出来,共同进步。纯手打,希望分享的这点经验能够帮助到大家。