单链表节点的删除思路
- 先找到需要删除的节点的前一个节点(temp)
- temp.next = temp.next.next
- 被删除节点将不会有其他引用指向(会被垃圾回收机制回收)
代码实现
// 删除节点
// 1.head不能动,因此需要temp辅助节点找到待删除节点的前一个节点。
// 2.在比较的时候,是需要temp.next.no与待删除节点.no进行比较
public void dele(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;// temp后移
}
// 判断flag
if (flag) {// 找到
temp.next = temp.next.next;
} else {
System.out.printf("要找的节点%d, 不存在\n", no);
}
}
单链表应用实例
水浒英雄榜管理完成英雄人物的增删改查操作
package com.jun._3_linkedlist;
/**
* 通过单链表来管理英雄人物
*
* @author jun
*
*/
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.add2(hero1);
singleLinkedList.add2(hero4);
singleLinkedList.add2(hero2);
singleLinkedList.add2(hero3);
singleLinkedList.add2(hero3);
// 显示
singleLinkedList.list();
// 修改
HeroNode newHeroNode = new HeroNode(2, "小卢", "玉麒麟~~~~~");
System.out.println("修改后:");
singleLinkedList.update(newHeroNode);
singleLinkedList.list();
//删除
singleLinkedList.dele(1);
System.out.println("删除后:");
singleLinkedList.list();
}
}
//管理英雄
class SingleLinkedList {
// 初始化头结点
private HeroNode head = new HeroNode(0, "", "");
// 第一种添加节点的方式
// 思路:在没有考虑排名编号的时候。
// 1、找到当前链表的最后节点
// 2、将最后这个节点的next指向新的节点
public void add(HeroNode heroNode) {
// 辅助指针
HeroNode temp = head;
// 循环遍历
while (true) {
// 寻找链表的最后
if (temp.next == null) {
break;
}
// 未找到,将temp后移
temp = temp.next;
}
temp.next = heroNode;
}
// 第二种添加英雄的方式,根据排名插入指定位置(如果有这个排名,则添加失败,并且给出提示)
public void add2(HeroNode heroNode) { // 寻找的temp是位于添加位置的前一个节点
HeroNode temp = head;
boolean flag = false;// 标识编号是否存在,默认为false
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.no > heroNode.no) { // 位置找到了,在temp后插入
break;
} else if (temp.next.no == heroNode.no) {
// 编号存在
flag = true;
break;
}
temp = temp.next; // 后移,遍历
}
// 判断falg的值
if (flag) {
System.out.printf("编号%d存再,不能加入\n", heroNode.no);
} else {
// 插入链表中,temp后
heroNode.next = temp.next;
temp.next = heroNode;
}
}
// 删除节点
// 1.head不能动,因此需要temp辅助节点找到待删除节点的前一个节点。
// 2.在比较的时候,是需要temp.next.no与待删除节点.no进行比较
public void dele(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;// temp后移
}
// 判断flag
if (flag) {// 找到
temp.next = temp.next.next;
} else {
System.out.printf("要找的节点%d, 不存在\n", no);
}
}
// 修改节点的信息
public void update(HeroNode newHeroNode) {
// 判空
if (head.next == null) {
System.out.println("链表为空");
return;
}
// 找到需要的节点(辅助变量)
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.printf("没有找到编号%d的节点,不能修改\n", newHeroNode.no);
}
}
// 显示链表
public void list() {
if (head.next == null) {
System.out.println("链表为空");
return;
}
HeroNode temp = head.next;
while (true) {
// 判断
if (temp == null) {
break;
}
// 不为空,输出节点信息
System.out.println(temp);
// 将next后移
temp = temp.next;
}
}
}
//定义节点
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;
}
// 重写toString
@Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
}
输出结果
编号3存再,不能加入
HeroNode [no=1, name=宋江, nickname=及时雨]
HeroNode [no=2, name=卢俊义, nickname=玉麒麟]
HeroNode [no=3, name=吴用, nickname=智多星]
HeroNode [no=4, name=林冲, nickname=豹子头]
修改后:
HeroNode [no=1, name=宋江, nickname=及时雨]
HeroNode [no=2, name=小卢, nickname=玉麒麟~~~~~]
HeroNode [no=3, name=吴用, nickname=智多星]
HeroNode [no=4, name=林冲, nickname=豹子头]
删除后:
HeroNode [no=2, name=小卢, nickname=玉麒麟~~~~~]
HeroNode [no=3, name=吴用, nickname=智多星]
HeroNode [no=4, name=林冲, nickname=豹子头]