Java数据结构与算法-SingleLinkedList单向链表插入,删除,查找,修改详解及代码

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 + "]";
	}
    
}

以上是我写的代码,仅供参考,欢迎指正。

注意:下一篇我们聊一聊线性存储和链式存储的优缺点比较,以及应用场景。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值