java单链表增删改
好汤圆 人气:0什么是链表
链表是有序的列表,但是它在内存中是存储如下
小结:
- 链表是以节点的方式来存储,是链式存储
- 每个节点包含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); //加入按照编号的顺序 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) {//说明希望添加的编号已经存在 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 + '\'' + '}'; } }
输出结果
加载全部内容