1.1 链表介绍
链表是有序的列表,但是它在内存中是存储如下
1) 链表是以节点的方式来存储,是链式存储
2) 每个节点包含data域,next域:指向下一个节点
3) 如图:发现链表的各个节点不一定是连续存储
4) 链表分带头节点的链表和不带头结点的链表,根据实际需求来确定
1.2 单链表的应用实例
使用带head头的单向链表实现 - 水浒英雄排行榜管理完成对英雄人物的增删改查操作
/**
* 用于管理节点(单向链表)
*/
class SingleLinkedList {
// 创建链表的头节点
private HeroNode heroHead = new HeroNode(0, "","");
/**
* 在链表中添加元素
* @param heroNode
*/
public void add(HeroNode heroNode) {
HeroNode tmp = heroHead;
while (true){
if (tmp.next == null){
break;
}
tmp = tmp.next;
}
tmp.next = heroNode;
}
/**
* 按照顺序添加元素
* @param heroNode
*/
public void addByOrder(HeroNode heroNode) {
HeroNode tmp = heroHead;
// 设置一个标记
boolean flag = false;
while (true){
if (tmp.next == null){
break;
}
if (tmp.next.no == heroNode.no){
flag = true;
break;
}
if (tmp.next.no > heroNode.no) {
break;
}
tmp = tmp.next;
}
if (!flag){
heroNode.next = tmp.next;
tmp.next = heroNode;
}else {
System.out.println("链表中已经存在这个元素了");
}
}
/**
* 修改链表中的数据
* @param heroNode
*/
public void update(HeroNode heroNode){
HeroNode tmp = heroHead;
// 设置标签
boolean flag = false;
while (true){
if (tmp.next == null){
break;
}
if (tmp.next.no == heroNode.no){
flag = true;
break;
}
tmp = tmp.next;
}
if (flag){
heroNode.next = tmp.next.next;
tmp.next = heroNode;
} else {
System.out.println("链表中并无这个元素");
}
}
/**
* 删除链表中的数据
* @param heroNode
*/
public void del(HeroNode heroNode){
HeroNode tmp = heroHead;
boolean flag = false;
while (true){
if (tmp.next == null){
break;
}
if (tmp.next.no == heroNode.no)
{
flag = true;
break;
}
tmp = tmp.next;
}
if (flag){
tmp.next = tmp.next.next;
} else {
System.out.println("链表中并无该元素");
}
}
/**
* 显示链表中的元素
*/
public void list(){
HeroNode tmp = heroHead;
if (tmp.next == null){
System.out.println("这是一个空的链表!");
}
while (true){
if (tmp.next == null)
break;
System.out.println(tmp.next);
tmp = tmp.next;
}
}
}
/**
* 节点
*/
class HeroNode {
/*
* 节点的属性
*/
public int no;
public String name;
public String nickName;
public HeroNode next;
/**
* 构造函数
* @param no
* @param name
* @param nickName
*/
public HeroNode(int no, String name, String nickName) {
this.no = no;
this.name = name;
this.nickName = nickName;
}
/**
* 重写toString方法
* @return
*/
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}