单链表的创建、增、删、改、查

双向链表的增删改查: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 + '\'' +
'}';
}
}

测试结果

最新文章

  1. POJ2632
  2. mysql 判断 字段是否为空
  3. 双栈排序(codevs 1170)
  4. 【android tools】内存、网络、界面性能响应优化的工具
  5. Groovy学习笔记(一)
  6. swfit-pod使用
  7. c程序设计语言_习题7-6_对比两个输入文本文件_输出它们不同的第一行_并且要记录行号
  8. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(1)-前言与目录(持续更新中...)
  9. AprioriTID algorithm
  10. LayoutInflater 与 inflate
  11. ecshop中getAll ,getOne ,getRow的区别
  12. hdu_4718_The LCIS on the Tree(树链剖分+线段树合并)
  13. php追加数组
  14. OpenCv结构和内容
  15. spring boot异常积累
  16. error :expected initializer before
  17. 同一个windows server 部署多个tomcat
  18. Web请求过程
  19. springboot2系列目录
  20. ALGO-141_蓝桥杯_算法训练_P1102

热门文章

  1. 走进Redis:哨兵集群
  2. Luogu3855 [TJOI2008]Binary Land (BFS)
  3. 面试突击74:properties和yml有什么区别?
  4. 新一代分布式实时流处理引擎Flink入门实战操作篇
  5. 第八十篇:Vue购物车(一) 购物车基本框架
  6. 如何使用Postman快速简单的调用快递物流平台快递鸟API接口
  7. 自定义View4-塔防小游戏第一篇:一个防御塔+多个野怪(简易版)*
  8. uniapp小程序新版授权登录
  9. Sentinel 源码分析-限流原理
  10. 【ASP.NET Core】自定义Session的存储方式