Java实现单链表基础操作
作者:缘分锝天空(李延胜) 发布时间:2021-08-07 13:46:04
标签:java,单链表
关于链表
链表是有序的列表链表是以节点的方式来存储每个节点包含data域,next域(指向下一个节点)分带头节点的链表和没有头节点的链表
定义一个节点:
package linkedQueue;
public 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 + '\'' +
'}';
}
}
定义一个链表:
实现以下功能:
添加节点
按序添加节点
删除节点
修改节点
遍历节点
反向打印节点
链表反转
统计节点个数
打印倒数第n个节点
程序:
package linkedQueue;
import java.util.Stack;
public class SingleLinkedList {
private HeroNode head = new HeroNode(0, "", "");
public HeroNode getHead() {
return head;
}
//反向打印节点
public static void reversePrint(HeroNode head) {
if (head.next == null) {
return;
}
// 创建一个栈
Stack<HeroNode> heroNodes = new Stack<>();
HeroNode cur = head.next;
while (cur != null) {
heroNodes.push(cur); //入栈
cur = cur.next;
}
// 出栈打印
while (heroNodes.size() > 0) {
System.out.println(heroNodes.pop());
}
}
/**
* 添加节点
* @param heroNode
*/
public void add(HeroNode heroNode) {
HeroNode temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = heroNode;
}
/**
* 有序添加节点
* @param herNode
*/
public void addByOrder(HeroNode herNode) {
HeroNode temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.no > herNode.no) {
break;
} else if (temp.next.no==herNode.no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
System.out.println("你要插入的节点的编号已经存在!!!!");
} else {
herNode.next = temp.next;
temp.next = herNode;
}
}
/**
* 更新节点数据
* @param newHeroNode
*/
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;
}
if (flag) {
temp.name = newHeroNode.name;
temp.nickname = newHeroNode.nickname;
} else {
// 没有找到
System.out.println("没有找到编号" + newHeroNode.no + "的节点,不能修改");
}
}
/**
* 刪除节点
* @param no
*/
public void del(int no) {
HeroNode temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.no == no) {
flag = true;
break;
}
temp=temp.next;
}
if (flag) {
temp.next = temp.next.next;
}
}
/**
* 遍历节点
*/
public void showList() {
if (head.next == null) {
System.out.println("链表为空");
return;
}
HeroNode temp = head.next;
while (true) {
if (temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
/**
* 统计有效节点的个数
*/
public static int getLength(HeroNode head) {
if (head.next == null) { //空链表
return 0;
}
int length = 0;
HeroNode herNode = head.next;
while (herNode != null) {
length++; // 计数
herNode=herNode.next; // 指针后移
}
return length;
}
/**
* 求倒数第index个节点
* @param head 头节点
* @param index 倒数第k个
* @return
*/
public static HeroNode findLastIndexNode(HeroNode head, int index) {
// 判断是否是空链表
if (head.next == null) {
return null;
}
// 拿到链表的长度
int size = getLength(head);
// index校验,看是否在范围内
if (index <= 0 || index > size) {
return null;
}
// 定位倒数第index个节点
HeroNode herNode = head.next;
for (int i = 0; i < size - index; i++) {
herNode = herNode.next;
}
return herNode;
}
//单链表反转
public static void reverseList(HeroNode head) {
// 如果当前链表为空或者只有一个节点,直接返回
if (head.next == null || head.next.next == null) {
return;
}
// 定义辅助变量来遍历链表
HeroNode cur = head.next;
HeroNode next = null;//指向当前节点[cur]的下一个节点
HeroNode reverseHead = new HeroNode(0, "", "");
// 遍历原来节点,每遍历一个节点,将其取出,并放在新的链表的最前端
while (cur != null) {
next = cur.next;//暂时保存当前节点的下一个节点
cur.next = reverseHead.next;//将cur的下一个节点指向新的链表的最前端
reverseHead.next=cur;//将cur链接到新的链表
cur = next;
}
head.next = reverseHead.next;
}
}
来源:https://blog.csdn.net/weixin_44107140/article/details/122831673
0
投稿
猜你喜欢
- 字符串操作在任意编程语言的日常编程中都随处可见,今天来汇总一下 C# 中关于字符串的一些你可能遗忘或遗漏的知识点。逐字字符串在普通字符串中,
- 今天,给大家分享一个Java后端利用Phantomjs实现生成图片的功能,同学们使用的时候,可以参考下!PhantomJS简介首先,什么是P
- 编写一个简单的mybatis进行插入数据的实例1 数据库建表 其中建表dob=Date of Birth 的意思create table s
- 如下所示:# ===============================================================
- mapper文件使用in("str1","str2")mybatis的xxxMapper.xml文件
- 简介常见的4种使用线程的方法:1实现 Runnable 接口;2实现 Callable 接口;3继承 Thread 类。4匿名内部类的写法。
- 数据库里面表的字段中带有“”_“下划线,我们知道插件默认的是将这些带有下划线的字段默认的变成“优美的驼峰式”的。表是肯定不能动的,实体类的字
- 表述在一次服务更新后发现每天凌晨0点3秒服务准时挂,开始的时候认为是maven依赖中存在system.exit(3)类似这样的代码,但是我想
- 本文为大家分享了java画出五子棋游戏棋盘的方法,供大家参考,具体内容如下棋盘模块:画五子棋棋盘:19条横线、19条竖线步骤一:显示棋盘我有
- 前言之前在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务
- 一、前言对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外。二、MyBatis的初始化做了什么2.1 Mybatis的
- 在Java中,可以通过Runtime类或ProcessBuilder类来实现调用外部程序。Runtime类与ProcessBuilder类使
- 这篇文章主要介绍了基于Java检查IPv6地址的合法性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 一、流程图二、Token1、token是一种客户端认证机制,是一个经过加密的字符串,安全性强,支持跨域2、用户第一次登录,服务器通过数据库校
- List接口是Collection接口的子接口,List有一个重要的实现类--ArrayList类,List中的元素是有序排列的而且可重复,
- 有序链表:按关键值排序。删除链头时,就删除最小(/最大)的值,插入时,搜索插入的位置。插入时需要比较O(N),平均O(N/2),删除最小(/
- 前言本章是关于Java数组的最全汇总,本篇为汇总中篇,主要讲了二维数组和不规则的数组的相关内容。数组是最常见的一种数据结构,它是相同类型的用
- 1.首先,八种基本数据类型分别是:int、short、float、double、long、boolean、byte、char; &
- springboot整合MySQL很简单,多数据源就master,slave就行了,但是在整合DB2就需要另起一行,以下是同一个yml文件先
- 前言上一节我们说到从HttpWebHandlerAdapter的handle方法说起到DispatcherHandler的调用流程那么Htt