java实现单链表的创建、增、删、改、查
单链表的创建、增、删、改、查
双向链表的增删改查:https://blog.csdn.net/weixin_43304253/article/details/119761865
单链表:单链表中的每个节点不仅包含储存的数据,还包含指向下一个节点的链接。
定义节点:
//定义节点
class Node {
public Node next;//指向下一个新的节点
int val;
public Node(int val) {//通过构造函数赋值
this.val = val;
}
}
1、增加一个节点
1、新创建一个节点
- 2、将cur的next指向pre的next
- 3、将pre的next指向cur
//按照顺序插入元素
public void addOrder(Node node) {
Node temp = head;
//寻找插入的位置
while (true) {
//1、链表为空、直接在链表尾部插入
if (temp.next == null) {
temp.next = node;
return;
}
//2、需要找到插入点的前一个节点,
if (temp.next.val >= node.val) {
node.next = temp.next;
temp.next = node;
return;
}
temp = temp.next;
}
}
直接在链表尾部添加节点:只需要遍历到链表的最后,将next指向新的节点就可。
代码实现
//在链表尾增加节点
public void add(Node node) {
//1、设置辅助节点
Node temp = head;
//2、找到链表的最后
while (true) {
if (temp.next != null) {
temp = temp.next;
} else {
break;
}
}
//3、找到最后,插入
temp.next = node;
}
2、删除一个节点
- 1、找到待删除元素的上一个节点以及下一个节点
- 2、通过遍历找到待删除元素的前一个节点,通过将前一个节点的指向指向当前节点的下一个节点
代码实现
//删除某一个节点
public void deleteLinkList(int num) {
Node temp = head;
boolean flag = false;//标志位
while (!flag) {
if (temp.next == null) {
System.out.println("链表中不存在待删除元素0");
return;
}
if (temp.next.val == num) {
System.out.println("找到了待删除数据:" + temp.next.val);
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.next = temp.next.next;
}
}
3、修改某一个节点
通过遍历找到需要修改的节点,修改数据
//修改节点
public void upDateLinkList(int data, int num) {
Node temp = head;//辅助数组
while (true) {
if (temp.next == null) {
System.out.println("链表为空");
return;
}
if (temp.next.val == data) {
//修改新元素
temp.next.val = num;
return;
}
temp = temp.next;
}
}
4、查询某一个节点
和修改节点相似
//取得某一个节点
public void getLinkList(int num) {
Node temp = head;
while (true) {
if (temp.next == null) {
System.out.println("链表中不存在该元素");
return;
}
if (temp.next.val == num) {
System.out.println("找到了该元素:" + temp.next.val);
break;
}
temp = temp.next;
}
}
5、遍历单链表
通过辅助数组,遍历到每一个节点,打印链表存储的数值
//遍历节点
public void show() {
Node temp = head.next;
if (head.next == null) {
return;
}
System.out.print("单链表为:[ ");
while (true) {
if (temp == null) {
break;
}
System.out.print(temp.val + "、");
temp = temp.next;
}
System.out.println(" ]");
}
}
举例:头节点设定为链表的开始,所有的节点连接在后边
package com.zheng.demo1;
public class MySingleLinkList {
public static void main(String[] args) {
//创建节点
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(8);
//创建链表
SingleLinkList singleLinkList = new SingleLinkList();
singleLinkList.add(node1);
singleLinkList.add(node2);
singleLinkList.add(node3);
singleLinkList.add(node4);
singleLinkList.add(node5);
System.out.println("添加数据后的节点:");
singleLinkList.show();
singleLinkList.getLinkList(3);//查找
singleLinkList.deleteLinkList(4);
System.out.println("删除数据4后的链表:");
singleLinkList.show();
//修改
System.out.println("将数据为2的节点的值修改为22");
singleLinkList.upDateLinkList(2, 22);
System.out.println("修改后的节点信息:");
singleLinkList.show();
// //创建链表2
// System.out.println("==================");
// SingleLinkList singleLinkList1 = new SingleLinkList();
// singleLinkList1.addOrder(node4);
// singleLinkList1.addOrder(node3);
// singleLinkList1.addOrder(node1);
// singleLinkList1.addOrder(node2);
// singleLinkList1.addOrder(node5);
// singleLinkList1.show();
}
}
class SingleLinkList {
//构造一个头节点
private Node head = new Node(0);
//增加节点
public void add(Node node) {
//1、设置辅助节点
Node temp = head;
//2、找到链表的最后
while (true) {
if (temp.next != null) {
temp = temp.next;
} else {
break;
}
}
//3、找到最后,插入
temp.next = node;
}
//删除某一个节点
public void deleteLinkList(int num) {
Node temp = head;
boolean flag = false;//标志位
while (!flag) {
if (temp.next == null) {
System.out.println("链表中不存在待删除元素0");
return;
}
if (temp.next.val == num) {
System.out.println("找到了待删除数据:" + temp.next.val);
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.next = temp.next.next;
}
}
//取得某一个节点
public void getLinkList(int num) {
Node temp = head;
while (true) {
if (temp.next == null) {
System.out.println("链表中不存在该元素");
return;
}
if (temp.next.val == num) {
System.out.println("找到了该元素:" + temp.next.val);
break;
}
temp = temp.next;
}
}
//修改节点
public void upDateLinkList(int data, int num) {
Node temp = head;//辅助数组
while (true) {
if (temp.next == null) {
System.out.println("链表为空");
return;
}
if (temp.next.val == data) {
//修改新元素
temp.next.val = num;
return;
}
temp = temp.next;
}
}
//按照顺序插入元素
public void addOrder(Node node) {
Node temp = head;
//寻找插入的位置
while (true) {
//1、链表为空、直接在链表尾部插入
if (temp.next == null) {
temp.next = node;
return;
}
//2、需要找到插入点的前一个节点,
if (temp.next.val >= node.val) {
node.next = temp.next;
temp.next = node;
return;
}
temp = temp.next;
}
}
//遍历节点
public void show() {
Node temp = head.next;
if (head.next == null) {
return;
}
System.out.print("单链表为:[ ");
while (true) {
if (temp == null) {
break;
}
System.out.print(temp.val + "、");
temp = temp.next;
}
System.out.println(" ]");
}
}
//定义节点
class Node {
public Node next;//指向下一个新的节点
int val;
public Node(int val) {//通过构造函数赋值
this.val = val;
}
}
实例二、单链表存储学生的信息
package com.zheng.demo2;
public class MyTest {
public static void main(String[] args) {
//定义节点
Student student1 = new Student(1, "小明", "男");
Student student2 = new Student(2, "小红", "女");
Student student3 = new Student(3, "小黑", "男");
Student student4 = new Student(4, "小青", "女");
//2、初始化链表
LinkList linkList = new LinkList();
linkList.addStudent(student1);
linkList.addStudent(student2);
linkList.addStudent(student3);
linkList.addStudent(student4);
//遍历
linkList.queryLinkList();
}
}
class LinkList {
//定义链表的开始位置
private Student head = new Student(0, "", "");
//增加节点,从尾部
public void addStudent(Student student) {
Student temp = head;//辅助数组
boolean flag = false;
while (true) {
if (temp.next == null) {
flag = true;
break;
} else {
temp = temp.next;
}
}
if (flag) {
temp.next = student;
}
}
//遍历
public void queryLinkList() {
Student temp = head;
if (head.next == null) {
System.out.println("链表为空");
return;
}
while (true) {
if (temp.next == null) {
return;
}
System.out.println(temp.next);
temp = temp.next;
}
}
}
//定义一个学生信息的节点类
class Student {
int id;//学号
String name;//姓名
String sex;//性别
Student next;//下一个学生的节点
public Student(int id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
测试结果
java实现单链表的创建、增、删、改、查的更多相关文章
- 好用的SQL TVP~~独家赠送[增-删-改-查]的例子
以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...
- iOS FMDB的使用(增,删,改,查,sqlite存取图片)
iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...
- iOS sqlite3 的基本使用(增 删 改 查)
iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...
- django ajax增 删 改 查
具于django ajax实现增 删 改 查功能 代码示例: 代码: urls.py from django.conf.urls import url from django.contrib impo ...
- ADO.NET 增 删 改 查
ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...
- MVC EF 增 删 改 查
using System;using System.Collections.Generic;using System.Linq;using System.Web;//using System.Data ...
- python基础中的四大天王-增-删-改-查
列表-list-[] 输入内存储存容器 发生改变通常直接变化,让我们看看下面列子 增---默认在最后添加 #append()--括号中可以是数字,可以是字符串,可以是元祖,可以是集合,可以是字典 #l ...
- django单表操作 增 删 改 查
一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...
- Java操作MongoDB:连接&增&删&改&查
1.连接 ①方式一 MongoClientOptions.Builder builder = MongoClientOptions.builder(); //可以通过builder做各种详细配置 Mo ...
随机推荐
- Eplan创建符号
1.打开Eplan P8 ,新建一个名为"新项目"的项目,然后选择菜单"工具"----"主数据"-----"符号库"-- ...
- .NET CORE 读书笔记之与.NET Framework对比
.NET Framework存在的问题 它是属于系统级别安装的程序 操作系统内的所有程序共享一个.NET Framework实例,如果其中某一个应用程序需要升级Framework,其他程序也会收到影响 ...
- 痞子衡嵌入式:聊聊i.MXRT1170双核下不同GPIO组的访问以及中断设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170双核下不同GPIO组的访问以及中断设计. 在双核 i.MXRT1170 下设计应用程序,有一个比较重要的考虑点就是外 ...
- mysql中文乱码--存入mysql里的中文变成问号的解决办法
今天,服务器里测试的时候,发现存入数据库的中文全部变成问号了! 首先想到这是编码问题:于是乎再次设置数据库的编码为utf8 可是,问题仍然存在: 后来发现,这个问题的根源应该是: 虽然数据库编码是ut ...
- Mybatis介绍、使用IDEA快速入门
1. Mybatis概念 MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发 JavaEE三层架构:表现层.业务层.持久层 JDBC 与 MyBatis 对比: MyBatis 本是 A ...
- postgresql用户与权限管理
pg使用角色的概念管理数据库访问权限,角色是一系列相关权限的集合.为了管理方便,通常把一系列先关的权限赋予给一个角色,如果哪个用户需要这些权限,就把这些角色赋予给响应的用户. 由于用户也拥有一系列的相 ...
- C++ 添加程序图标到我的电脑
C++ 像我的电脑中 百度网盘的 那图标快捷方式.如何生成的呢?设置程序图标到我的电脑 请看下边代码 就ok了(*^__^*) 嘻嘻-- 类似下图: 大家如果看我下边的不是很清楚,可以下载这个具体工程 ...
- Java反射(重要)
全文内容 1: 获取字节码文件对象的三种方式 2: 获取公有,私有方法,并调用构造方法,成员方法 3: 获取并调用私有成员变量 4: 如何为实例对象的成员变量赋值 5: 文末有一些注意 tea1类代码 ...
- ARC120D Bracket Score 2 (模拟)
题面 给一个长度为 2 N 2N 2N 的序列 A A A,定义一个长度为 2 N 2N 2N 的合法括号序列的 得分(score) 为: 对于每对配对的括号 i , j i,j i,j, ∣ A i ...
- SFSafariViewController 加载的网页与原生oc之间的交互
问题描述: 工作中碰到这样一种场景, WebApp 已经实现了IM即时通讯及基于WebRTC实现的音视频会议,音视频聊天. 也是半路接手的项目,项目整体是使用WKWebView套壳加载h5 页面实现( ...