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)不足之处希望大家指出来,共同进步。纯手打,希望分享的这点经验能够帮助到大家。