SingleLinkedList单向链表插入,删除,查找,修改详解及代码
单向链表学习目标
1. 链表的介绍
2. 单向链表的存储特点以及原理
3. 基本操作:插入,删除等
4. 单向链表应用场景举例
5. 代码实现
一,单向链表的介绍
链表是一个有序列表,单向链表有一个头结点(根据需要设置,也可没有)一般不存储数据,只表示一个单向链表的起始位置,单向链表的节点组成:一个data域和一个next指针域,指向下一个节点。
二,单向链表的存储特点
1)链表是以节点的方式来存储,是链式存储
2)每个节点包含data域,next域:指向下一个节点.
3)如上图:发现链表的各个节点不一定是连续存储
4)链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定。
存储示意图:
三,基本操作
- 插入:核心代码:newNode.next = temp.next,然后temp.next = newNode;
- 删除:先查找到那个元素,然后进行删除,前后节点的指针重新设置,temp.next = temp.next.next,删除后的元素没有其他引用指向,会被垃圾回收机制进行回收处理。
- 修改:先找到修改的元素,然后进行修改
- 查找:遍历
四,应用场景举例
需求:写一个王者荣耀英雄榜,将英雄插入到链表中,并且实现增删改查操作。
五,代码实现
package com.atxiaopeng.linkedlist;
import java.util.Scanner;
public class SingleLinkedListDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1,创建英雄榜
SingleLinkedlist s = new SingleLinkedlist();
// HeroNode h1 = new HeroNode(1, "阿珂", "节奏热浪");
// HeroNode h2 = new HeroNode(2, "猴子", "大圣娶亲");
// HeroNode h3 = new HeroNode(3, "李白", "凤 求 凰");
// HeroNode h4 = new HeroNode(4, "露娜", "紫霞仙子");
boolean b = true;
while (b) {
System.out.println("==========王者英雄榜==========");
System.out.println(" 1,创建英雄并进榜(无序) ");
System.out.println(" 2,创建英雄并进榜(有序)");
System.out.println(" 3,修改英雄属性 ");
System.out.println(" 4,英雄榜删除英雄 ");
System.out.println(" 5,显示当前英雄榜 ");
System.out.println(" 6,退出程序 ");
System.out.println("===========================");
System.out.print("输入操作的选项: ");
int key = new Scanner(System.in).nextInt();
switch (key) {
case 1:
s.createHero1();
break;
case 2:
s.createHero2();
break;
case 3:
s.update();
break;
case 4:
s.delete();
break;
case 5:
s.show();
break;
case 6:
b = false;
System.out.println("程序成功退出!");
break;
default:
break;
}
}
}
}
class SingleLinkedlist{
//1,创建头结点,不存放数据,不让随便动
private HeroNode headHeroNode = new HeroNode(0, "", "");
boolean flag = false;//判断标志,例如:判断为空的标志等
//创建英雄并无序插入
public void createHero1() {
System.out.print("输入你要加入英雄的排名:");
int newNu = new Scanner(System.in).nextInt();
System.out.print("输入你要加入英雄的名字:");
String newName = new Scanner(System.in).next();
System.out.print("输入你要加入的英雄的常用皮肤:");
String newSkin = new Scanner(System.in).next();
add(new HeroNode(newNu,newName,newSkin));
}
//创建英雄并有序插入
public void createHero2() {
System.out.print("输入你要加入英雄的排名:");
int newNu = new Scanner(System.in).nextInt();
System.out.print("输入你要加入英雄的名字:");
String newName = new Scanner(System.in).next();
System.out.print("输入你要加入的英雄的常用皮肤:");
String newSkin = new Scanner(System.in).next();
addByordering(new HeroNode(newNu,newName,newSkin));
}
//2,无序插入
public void add(HeroNode heroNode) {
HeroNode temp = headHeroNode;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.nu == heroNode.nu) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
System.out.println("排名 : "+heroNode.nu+" 英雄之前已经加入,不能再次加入!");
}else {
heroNode.next = temp.next;
temp.next = heroNode;
System.out.println(heroNode.name+" 成功加入王者英雄榜!(无序)");
}
flag = false;
}
//3,有序插入
public void addByordering(HeroNode heroNode) {
HeroNode temp = headHeroNode;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.nu > heroNode.nu) {
break;
}else if (temp.next.nu == heroNode.nu) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
System.out.println("排名 : "+heroNode.nu+" 英雄之前已经加入,不能再次加入!");
}else {
heroNode.next = temp.next;
temp.next = heroNode;
System.out.println(heroNode.name+" 成功加入王者英雄榜!(有序)");
}
flag = false;
}
//删除英雄
public void delete() {
HeroNode temp = headHeroNode;
HeroNode random ;
if (temp.next == null) {
System.out.println("英雄榜为空,无法删除!!!");
return; //直接返回,不再继续往下运行
}
System.out.print("输入要删除英雄的名字:");
Scanner input = new Scanner(System.in);
String s1 = input.next();
while (true) {
if (temp.next == null) {
flag = true;
break;
}else if (temp.next.name.equals(s1)) {
break;
}
temp = temp.next;
}
if (flag) {
System.out.println("英雄榜中不存在该英雄,无法删除!!!");
} else {
random = temp.next;
temp.next = random.next;
System.out.println(random.name+" 英雄删除成功!");
}
flag = false;
}
//修改英雄属性
public void update() {
HeroNode temp = headHeroNode;
if (temp.next == null) {
System.out.println("英雄榜为空,无法修改!");
return;
}
System.out.print("输入你要修改的英雄的名字:");
String name = new Scanner(System.in).next();
while (true) {
if (temp.next == null) {
flag = true;
break;
}else if (temp.next.name.equals(name)) {
break;
}
temp = temp.next;
}
if (flag) {
System.out.println("英雄榜中不存在该英雄,无法修改!!!");
} else {
System.out.print("输入你要修改英雄的名字:");
String newName = new Scanner(System.in).next();
System.out.print("输入你要修改的英雄的常用皮肤:");
String newSkin = new Scanner(System.in).next();
temp.next.name = newName;
temp.next.skin = newSkin;
System.out.println("===英雄榜已更新!===");
}
flag = false;
}
//显示英雄榜
public void show() {
HeroNode temp = headHeroNode;
if (temp.next == null) {
System.out.println("王者英雄榜尚未有英雄加入!");
return;
}
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
System.out.println(temp+" ");
}
}
}
class HeroNode{
public int nu ;
public String name;
public String skin;
public HeroNode next;
public HeroNode(int n,String name ,String skin){
this.nu = n;
this.name = name;
this.skin = skin;
}
@Override
public String toString() {
return "王者英雄榜 :[排名=" + nu + ", 名字=" + name + ", 皮肤=" + skin + "]";
}
}
以上是我写的代码,仅供参考,欢迎指正。
注意:下一篇我们聊一聊线性存储和链式存储的优缺点比较,以及应用场景。