java实现单链表中的增删改(删除链表中的重复元素 java)

网友投稿 292 2022-07-28


本文实例为大家分享了java实现单链表中增删改的具体代码,供大家参考,具体内容如下

什么是链表

链表是有序的列表,但是它在内存中是存储如下

小结:

链表是以节点的方式来存储,是链式存储每个节点包含data 域, next 域:指向下一个节点.如图:发现链表的各个节点不一定是连续存储.链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定

单链表(带头结点) 逻辑结构示意图如下

单链表的增删改应用实例

使用带head 头的单向链表实现——三国英雄排行榜管理完成对英雄人物的增删改查操作

1.第一种方法在添加英雄时,直接添加到链表的尾部

2.第二种方式在添加英雄时,根据排名将英雄插入到指定位置(如果有这个排名,则添加失败,并给出提示)

思路:

(1) 先找到该节点,通过遍历,

(2) temp.name = newHeroNode.name ; temp.nickname= newHeroNode.nickname

代码

package com.hsy.linkedlist;

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);

//加入按照编dYeSfYCs号的顺序

singleLinkedList.addByOrder(hero1);

singleLinkedList.addByOrder(hero4);

singleLinkedList.addByOrder(hero3);

singleLinkedList.addByOrder(hero2);

//显示

singleLinkedList.showList();

//测试修改

HeroNode newHeroNode = new HeroNode(3, "卤蛋", "暴躁个锤子");

singleLinkedList.update(newHeroNode);

System.out.println("修改后的链表情况:");

singleLinkedList.showList();

//删除一个节点

singleLinkedList.delete(1);

System.out.println("删除后的链表情况:");

singleLinkedList.showList();

}

}

//定义SingleLinkedList来管理我们的英雄

class SingleLinkedList {

//初始化一个头节点,不存放数据

private final HeroNode head = new HeroNode(0, "", "");

//增

//添加节点到单向链表

public void add(HeroNode heroNode) {

//思路:(不考虑编号顺序)

//1.找到当前链表的最后节点

//2.将最后这个节点的next域指向新的节点

HeroNode temp = head;

//遍历链表,找到最后的节点

while (true) {

if (temp.next == null) {

break;

}

//如果没有找到最后,将temp后移

temp = temp.next;

}

//必须保证退出while循环时,temp指向链表的最后,并将最后这个节点的next域指向新的节点

temp.next = heroNode;

}

//第二种方式在添加英雄时,根据排名将英雄插入到指定位置

// (如果有这个排名,则添加失败,并给出提示)

public void addByOrder(HeroNode heroNode) {

//由于头节点不能动,因此我们仍然通过一个辅助变量来帮助我们找到添加的位置

//因为是单链表,因此我们找的temp位于添加位置的前一个结点,否则不能插入

HeroNode temp = head;

boolean flag = false;//标识添加的编号是否已经存在,默认为false

while (true) {

if (temp.next == null) {

break;

}

if (temp.next.no > heroNode.no) {//位置找到

break;

} else if (temp.next.no == heroNode.no) {//说明希望添加的编号已经存在

http:// flag = true;

break;

}

temp = temp.next;

}

//判断flag的值

if (flag) {//编号已经存在

System.out.println("准备插入的英雄的编号:" + heroNode.no + "已经存在,不能再加入!");

} else {

heroNode.next = temp.next;

temp.next = heroNode;

}

}

//删

//head不能动,我们需要一个temp辅助节点找到待删除节点的前一个结点

//我们在比较的时候是temp.next.no和需要删除的节点的no进行比较

public void delete(int no) {

HeroNode temp = head;

boolean flag = false;

while (true) {

if (temp.next == null) {

break;

}

if (temp.next.no == no) {

//找到了待删除节点的前一个结点temp

flag = true;

break;

}

temp = temp.next;

}

if (flag) {

temp.next = temp.next.next;

} else {

System.out.println("要删除的" + no + "节点不存在");

}

}

//改

//修改节点的信息,根据编号来修改

public void update(HeroNode newHeroNode) {

//判断链表是否为空

if (head.next == null) {

System.out.println("链表为空!");

}

HeroNode temp = head.next;

boolean flag = false;

while (true) {

if (temp == null) {

break;

}

if (temp.no == newHeroNode.no) {

//找到

flag = true;

break;

}

temp = temp.next;

}

//根据flag判断是否找到需要修改的值

if (flag) {//编号已经存在

temp.name = newHeroNode.name;

temp.nickname = newHeroNode.nickname;

} else {//没有找到

System.out.println("没有找到编号为:" + newHeroNode.no + "的节点,不能修改");

}

}

//查

//显示遍历链表

public void showList() {

//判断链表是否为空

if (head.next == null) {

System.out.println("链表为空!");

}

//由于头节点不能动,因此我们需要一个辅助变量来遍历

HeroNode temp = head.next;

while (true) {

//判断链表是否到最后

if (temp == null) {

break;

}

System.out.println(temp);

//这时需要将temp后移,否则会陷入死循环

temp = temp.next;

}

}

}

//定义一个HeroNode,每个HeroNode对象就是一个节点

class HeroNode {

public int no;

public String name;

public String nickname;

public HeroNode next;//指向下一个节点

//创建构造器

public HeroNode(int no, String name, String nickname) {

this.no = no;

this.name = name;

this.nickname = nickname;

}

@Override

public String toString() {

return "HeroNode{" +

"no=" + no +

", name='" + name + '\'' +

", nickname='" + nickname + '\'' +

'}';

}

}

输出结果


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot详细讲解静态资源导入的实现(springboot静态注入)
下一篇:springboot+vue完成发送接口请求显示响应头信息
相关文章

 发表评论

暂时没有评论,来抢沙发吧~