链表(Linked List)
链表是有序的列表,但是它在内存中是存储如下
- 链表是以节点的方式来存储,是链式存储
- 每个节点包含 data 域, next 域:指向下一个节点.
- 如图:发现链表的各个节点不一定是连续存储.
- 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定
单链表(带头结点) 逻辑结构示意图如下
单链表的应用实例
使用带head头的单向链表实现 –水浒英雄排行榜管理
- 完成对英雄人物的增删改查操作
- 第一种方法在添加英雄时,直接添加到链表的尾部
- 第二种方式在添加英雄时,根据排名将英雄插入到指定位置(如果有这个排名,则添加失败,并给出提示)
public class SingleLinkedListDemo {
public static void main(String[] args) {
HeroNode hero1 = new HeroNode(1, "卢本伟1号");
HeroNode hero2 = new HeroNode(2, "卢本伟2号");
HeroNode hero3 = new HeroNode(3, "卢本伟3号");
HeroNode hero4 = new HeroNode(4, "卢本伟4号");
HeroNode hero5 = new HeroNode(4, "更新的卢本伟4号");
SingleLinkedList list = new SingleLinkedList();
list.addByOrder(hero1);
list.addByOrder(hero3);
list.addByOrder(hero2);
list.addByOrder(hero4);
list.list();
System.out.println("============删除=============");
list.deleteNode(3);
list.list();
System.out.println("============更新=============");
list.updateNode(hero5);
list.list();
}
}
//单链表
class SingleLinkedList {
//定义头节点
public HeroNode head = new HeroNode(0, null);
/**
* 普通末尾添加节点
*
* @param heroNode
*/
public void add(HeroNode heroNode) {
HeroNode temp = head;
while (temp.next != null) {
temp = temp.next;
}
temp.next = heroNode;
}
/**
* 按照no的顺序添加节点
*
* @param heroNode
*/
public void addByOrder(HeroNode heroNode) {
boolean flag = false;
HeroNode temp = head;
while (true) {
if (temp.next == null) {
break;
} else if (temp.next.no > heroNode.no){
break;
}else if (temp.next.no == heroNode.no){
flag = true;
break;
}
temp = temp.next;
}
if (!flag){
heroNode.next = temp.next;
temp.next = heroNode;
}else {
System.out.println("no: "+temp.no+" 已存在,插入失败");
}
}
/**
* 更新节点
* @param heroNode
*/
public void updateNode(HeroNode heroNode){
HeroNode temp = head;
boolean flag = false;
while (true){
if (temp.next==null){
System.out.println("链表为空.");
break;
}else if (temp.next.no==heroNode.no){
flag = true;
break;
}
temp = temp.next;
}
if (flag){
temp.next.name=heroNode.name;
}
}
/**
* 删除节点
* @param no
*/
public void deleteNode(int no){
HeroNode temp = head;
boolean flag = false;
while (true){
if (temp.next == null){
System.out.println("链表为空。");
break;
}else if (temp.next.no==no){
flag=true;
break;
}
temp = temp.next;
}
if (flag){
temp.next=temp.next.next;
}
}
/**
* 遍历显示链表
*/
public void list() {
if (head.next == null) {
System.out.println("链表为空");
return;
}
HeroNode temp = head;
while (temp.next != null) {
System.out.println(temp.next);
temp = temp.next;
}
}
}
//节点类
class HeroNode {
public int no;
public String name;
public HeroNode next;
public HeroNode(int no, String name) {
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}