java数据结构之单向链表(二)

java数据结构之单向链表(二)

前言

在上一个章节中主要是对链表的基础知识点做了简单的概述,目的就是为了熟悉链表的特性,接下来这个章节主要是对链表的功能能行增强,进一步完善对链表的熟练程度。

1 按照特定顺序添加节点

1.1准备工作

~~上一个章节中的添加节点的方法,只能够满足在链表的最后添加节点,新增一个方法,按照特定顺序来添加节点(这里演示递增)
思路分析:
(1)对链表进行遍历
-------目的:找出该节点的前一个位置
(2)通过编号判断该节点是否存在
(3)存在则不允许插入,并显示提示信息
(4)不存在则插入

前节点 — 插入的新节点----后节点
逻辑:让前节点的指针指向新节点,插入的新节点指向后节点。

1.2 代码演示(紧接上一个小结)
// 按照一定的顺序来添加节点的位置
	public void addByOrder(HeroNode node) {
		// 指针,用来移动链表
		HeroNode temp = head;
		// 用来判断当前节点是否存在
		boolean flag = false;
		while (true) {
			if (temp.next == null) {
				// 链表为空,直接退出
				break;
			}
			if (temp.next.no > node.no) {
				// node新节点存放的位置就被找到,存放在temp和temp.next中间,返回的temp为新节点的前一个位置
				break;
			} else if (temp.next.no == node.no) {
				// 判断出节点已经存在
				flag = true;
			}
			// 移动节点的位置
			temp = temp.next;
		}
		// 通过flag来判断是否可插入节点
		if (flag) {
			System.out.printf("准备插入英雄的编号%d 已经存在 \n", node.no);
			
		} else {
			// 插入节点
			// 新的节点指向temp的下一个节点
			node.next = temp.next;
			// temp节点指向新节点
			temp.next = node;
		}
	}
public class SingleLinkedListDemo {
	// 进行测试
	public static void main(String[] args) {
		// 创建节点
		HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");
		HeroNode heroNode2 = new HeroNode(2, "卢俊义", "玉麒麟");
		HeroNode heroNode3 = new HeroNode(3, "吴用", "智多星");
		HeroNode heroNode4 = new HeroNode(4, "林冲", "豹子头");
		// 创建链表
		SingleLinkedList linkedList = new SingleLinkedList();
//		linkedList.add(heroNode1);
//		linkedList.add(heroNode2);
//		linkedList.add(heroNode3);
//		linkedList.add(heroNode4);
		linkedList.addByOrder(heroNode4);
		linkedList.addByOrder(heroNode2);
		linkedList.addByOrder(heroNode1);
		linkedList.addByOrder(heroNode3);	
		linkedList.addByOrder(heroNode3);	
		linkedList.list();
	}
}
1.3 测试结果

在这里插入图片描述

2 修改链表节点的数据

2.1 代码准备

----修改操作和添加操作步骤大体相同
(1)两个辅助变量
temp:链表的指针,作用是用来遍历链表
flag :boolean类型,作为判断节点的值是否可进行修改的依据
(2)对链表节点进行遍历,找出修改节点的位置。
若不存在,返回提示信息;若存在,对节点的数据进行修改,节点编号不变。

2.2 代码演示

~~因比较简单,所以话不多直接上代码。

修改方法

	// 修改节点的数据(编号不变)
	public void update(HeroNode newHeroNode) {
		// 判断是否可以进行更新
		boolean flag = false;
		// 链表指针
		HeroNode temp = head;
		// 链表为空
		if (temp.next == null) {
			System.out.println("链表为空");
			return;
		}
		while (true) {
			// 遍历链表成的判定条件
			if (temp == null) {
			//temp为当前节点,即对当前节点进行修改
				break;
			}
			if (temp.no == newHeroNode.no) {
				// 进行跟节点数据
				flag = true;
				break;
			}
			temp = temp.next;
		}
		if (flag) {
			temp.name = newHeroNode.name;
			temp.nickName = newHeroNode.nickName;
		}else {
			System.out.printf("该英雄的编号 %d 不存在",newHeroNode.no);
		}
	}

测试代码

public static void main(String[] args) {
		// 创建节点
		HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");
		HeroNode heroNode2 = new HeroNode(2, "卢俊义", "玉麒麟");
		HeroNode heroNode3 = new HeroNode(3, "吴用", "智多星");
		HeroNode heroNode4 = new HeroNode(4, "林冲", "豹子头");
		// 创建链表
		SingleLinkedList linkedList = new SingleLinkedList();
//		linkedList.add(heroNode1);
//		linkedList.add(heroNode2);
//		linkedList.add(heroNode3);
//		linkedList.add(heroNode4);
		linkedList.addByOrder(heroNode4);
		linkedList.addByOrder(heroNode2);
		linkedList.addByOrder(heroNode1);
		linkedList.addByOrder(heroNode3);
		linkedList.list();
		System.out.println("修改完成后的链表----");
		HeroNode newHeroNode = new HeroNode(1, "宋江------", "及时雨------");
		linkedList.update(newHeroNode);
		linkedList.list();
	}
2.3 演示结果

在这里插入图片描述

3 删除链表节点

3.1 代码准备

(1)两个辅助变量
temp:链表的指针,作用是用来遍历链表
flag :boolean类型,作为判断节点的值是否可进行修改的依据
(2)对链表节点进行遍历,找出删除节点的前一个位置。
若不存在,返回提示信息;若存在,对节点的数据进行删除,节点编号不变。
(3)删除节点思路
让删除节点的前一个位置指向删除节点的后一个位置。

3.2 代码演示

删除节点

// 删除链表的节点
	public void del(int no) {
		// 链表指针
		HeroNode temp = head;
		// 是否可进行删除,默认为false
		boolean flag = false;
		while (true) {
			// 先判断链表是否为空
			if (temp.next == null) {
				System.out.println("链表为空");
				break;
			}
			if (temp.next.no == no) {
				// 找到该节点的前一个位置,可以进行删除
				flag = true;
				break;
			}
			temp = temp.next;
		}
		if (flag) {
			// 进行删除(令该节点的前一个节点指向该节点的后一个节点)
			temp.next = temp.next.next;
		} else {
			System.out.printf("英雄编号 %d 不存在,不能删除", no);
		}
	}

测试代码

public static void main(String[] args) {
		// 创建节点
		HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");
		HeroNode heroNode2 = new HeroNode(2, "卢俊义", "玉麒麟");
		HeroNode heroNode3 = new HeroNode(3, "吴用", "智多星");
		HeroNode heroNode4 = new HeroNode(4, "林冲", "豹子头");
		// 创建链表
		SingleLinkedList linkedList = new SingleLinkedList();
//		linkedList.add(heroNode1);
//		linkedList.add(heroNode2);
//		linkedList.add(heroNode3);
//		linkedList.add(heroNode4);
		linkedList.addByOrder(heroNode4);
		linkedList.addByOrder(heroNode2);
		linkedList.addByOrder(heroNode1);
		linkedList.addByOrder(heroNode3);
		linkedList.list();
//		System.out.println("修改完成后的链表----");
//		HeroNode newHeroNode = new HeroNode(1, "宋江------", "及时雨------");
//		linkedList.update(newHeroNode);
		
		System.out.println("删除完成后的链表");
		linkedList.del(1);
		linkedList.del(4);
		linkedList.list();
	}
3.3 测试结果

在这里插入图片描述

4 小结

(1)这一章节,主要是实现对单链表节点的增删改功能
(2)需要特别注意点为:在增加和删除操作时,是找出该节点的前一个位置;在修改操作时,是找到该节点的位置,二者代码会有所不同。
(3)不足之处希望大家指出来,共同进步。纯手打,希望分享的这点经验能够帮助到大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值