单链表节点的删除思路

  • 先找到需要删除的节点的前一个节点(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=豹子头]