一、链表(Linked List)介绍
链表是有序的列表,但是它在内存中是存储如下
小结上图:
- 链表是以节点的方式来存储,是链式存储
- 每个节点包含data 域, next 域:指向下一个节点.
- 如图:发现链表的各个节点不一定是连续存储.
- 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定
- 单链表(带头结点) 逻辑结构示意图如下
二、单链表的应用实例
使用带head 头的单向链表实现–水浒英雄排行榜管理完成对英雄人物的增删改查操作, 注: 删除和修改,查找
在添加英雄时,根据排名将英雄插入到指定位置(如果有这个排名,则添加失败,并给出提示)
思路的分析示意图:
- 修改节点功能
思路(1) 先找到该节点,通过遍历,(2) temp.name = newHeroNode.name ; temp.nickname= newHeroNode.nickname - 删除节点
思路分析的示意图:
三、代码演示
public class SingleLinkedListDemo {
public static void main(String[] args) {
// 增加节点
HeroNode hero1 = new HeroNode(1, "宋江", "及时雨");
HeroNode hero2 = new HeroNode(2, "卢俊义", "玉麒麟");
HeroNode hero3 = new HeroNode(3, "吴用", "智多星");
HeroNode hero4 = new HeroNode(4, "林冲", "豹子头");
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.add(hero1);
singleLinkedList.add(hero2);
singleLinkedList.add(hero3);
singleLinkedList.add(hero4);
// 修改节点
HeroNode hero5 = new HeroNode(1, "宋江宋江", "及时雨雨雨雨雨雨雨雨");
HeroNode hero6 = new HeroNode(4, "林冲冲冲冲", "豹子头豹子头豹子头豹子头");
singleLinkedList.update(hero5);
singleLinkedList.update(hero6);
// 删除节点
singleLinkedList.delete(1);
singleLinkedList.delete(3);
singleLinkedList.delete(4);
singleLinkedList.delete(2);
}
}
class SingleLinkedList {
// 创建一个头节点
private HeroNode head = new HeroNode(0, "", "");
// 增加新节点
public void add(HeroNode heroNode) {
HeroNode temp = head;
// 判断节点是否已经存在
boolean flag = false;
// 遍历所有节点,找到新节点no介于哪两个节点之间
while (true) {
if (temp.next == null) {
System.out.println("还没有数据,可以直接插入");
break;
} else if (temp.no == heroNode.no) {
flag = true;
System.out.println("该条节点已经存在" + heroNode.no);
break;
} else if (temp.next.no > heroNode.no) {
System.out.println("在该节点之后就可以插入");
break;
}
temp = temp.next;
}
if (!flag) {
heroNode.next = temp.next;
temp.next = heroNode;
}
list();
}
// 删除节点
public void delete(int no) {
HeroNode temp = head;
// 判断是否能偶找到该节点
boolean flag = false;
// 遍历节点
while (true) {
// 如果遍历到最后都没有找到要删除的节点,就跳出
if (temp.next == null) {
flag = false;
break;
}
// 找到节点
if (temp.next.no == no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.next = temp.next.next;
System.out.println("删除完成");
list();
} else {
System.out.println("没有找到要删除的节点");
}
}
// 修改节点
public void update(HeroNode heroNode) {
// 定义一个辅助变量
HeroNode temp = head;
// 判断是否找到该节点
boolean flag = false;
// 遍历查找
while (true) {
if (temp.next == null) {
flag = false;
break;
}
if (temp.next.no == heroNode.no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
heroNode.next = temp.next.next;
temp.next = heroNode;
System.out.println("修改之后的节点");
list();
} else {
System.out.println("找不到节点");
}
}
// 遍历所有节点
public void list() {
HeroNode temp = head;
if (temp.next == null) {
System.out.println("链表为空");
return;
}
while (true) {
if (temp.next == null) {
System.out.println("遍历完成!");
break;
}
System.out.println(temp.next);
temp = temp.next;
}
}
}
class HeroNode {
public int no;
public String name;
public String nickName;
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 + "]";
}
}
运行结果如下所示:
还没有数据,可以直接插入
HeroNode [no=1, name=宋江, nickName=及时雨]
遍历完成!
还没有数据,可以直接插入
HeroNode [no=1, name=宋江, nickName=及时雨]
HeroNode [no=2, name=卢俊义, nickName=玉麒麟]
遍历完成!
还没有数据,可以直接插入
HeroNode [no=1, name=宋江, nickName=及时雨]
HeroNode [no=2, name=卢俊义, nickName=玉麒麟]
HeroNode [no=3, name=吴用, nickName=智多星]
遍历完成!
还没有数据,可以直接插入
HeroNode [no=1, name=宋江, nickName=及时雨]
HeroNode [no=2, name=卢俊义, nickName=玉麒麟]
HeroNode [no=3, name=吴用, nickName=智多星]
HeroNode [no=4, name=林冲, nickName=豹子头]
遍历完成!
修改之后的节点
HeroNode [no=1, name=宋江宋江, nickName=及时雨雨雨雨雨雨雨雨]
HeroNode [no=2, name=卢俊义, nickName=玉麒麟]
HeroNode [no=3, name=吴用, nickName=智多星]
HeroNode [no=4, name=林冲, nickName=豹子头]
遍历完成!
修改之后的节点
HeroNode [no=1, name=宋江宋江, nickName=及时雨雨雨雨雨雨雨雨]
HeroNode [no=2, name=卢俊义, nickName=玉麒麟]
HeroNode [no=3, name=吴用, nickName=智多星]
HeroNode [no=4, name=林冲冲冲冲, nickName=豹子头豹子头豹子头豹子头]
遍历完成!
删除完成
HeroNode [no=2, name=卢俊义, nickName=玉麒麟]
HeroNode [no=3, name=吴用, nickName=智多星]
HeroNode [no=4, name=林冲冲冲冲, nickName=豹子头豹子头豹子头豹子头]
遍历完成!
删除完成
HeroNode [no=2, name=卢俊义, nickName=玉麒麟]
HeroNode [no=4, name=林冲冲冲冲, nickName=豹子头豹子头豹子头豹子头]
遍历完成!
删除完成
HeroNode [no=2, name=卢俊义, nickName=玉麒麟]
遍历完成!
删除完成
链表为空
下一节我们将展示双向链表,详情请关注我的主页