在这篇文章中,小编将带大家了解一下Java数据结构中链表的增删查改(以下结果均在IDEA中编译)希望在方便自己复习的同时也能帮助到大家
一. 概念与结构
链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。
虽然有这么多的链表的结构,但是我们重点掌握两种:
1.无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。
2.无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。
二.单链表接口实现
接下来新一带大家写无头单向非循环链表
import java.util.List;
/**
* Created with IntelliJ IDEA.
* Description: 链表
* User: mac
* Date: 2022-08-31
* Time: 10:09
*/
//ListNode代表一个节点 - 存放在一个节点类中
class ListNode {
public int val;
public ListNode next;
public ListNode(int val) {
this.val = val;
}
}
public class MyLinkedList {
public ListNode head;//链表的头引用
//打印链表
public void display() {
//this.head.next != null 会丢失一个数据
ListNode cur = this.head;
while (cur != null) {
System.out.print(cur.val + " ");
cur = cur.next;
}
System.out.println();
}
//查找是否包含关键字k
public boolean contains(int key) {
ListNode cur = this.head;
while (cur != null) {
if (cur.val == key) {
return true;
}
cur = cur.next;
}
return false;
}
//得到单链表的长度
public int size() {
int count = 0;
ListNode cur = this.head;
while (cur != null) {
count++;
cur = cur.next;
}
return count;
}
//头插法
public void addFirst(int data){
//绑定位置的时候一定要先绑定后边
ListNode node = new ListNode(data);
node.next = this.head;
this.head = node;
}
//尾插法
public void addLast(int data){
ListNode node = new ListNode(data);
if (this.head == null){//判空,否则就会造成引用异常this.head.next
this.head = node;
} else {
ListNode cur = this.head;
while (cur.next != null){
cur = cur.next;
}
//cur.next = null;
cur.next = node;
}
}
public ListNode findindex(int index){//通过下表来移动指针
ListNode cur = this.head;
while (index - 1 != 0){
cur = cur.next;
index--;
}
return cur;
}
//任意位置插入,第一个数据节点为0号下标
public void addIndex(int index, int data){
if (index < 0 || index > size()){
System.out.println("index位置不合法!");
return;
}
if (index == 0){
addFirst(data);
return;
}
if (index == size()){
addLast(data);
return;
}
ListNode cur = findindex(index);
ListNode node = new ListNode(data);
node.next = cur.next;
cur.next = node;
}
//删除第一次出现的关键字为key的节点
public void remove(int key){
if (this.head == null){
System.out.println("单链表为空,不能删除!");
return;
}
if (this.head.val == key){//判断头部是否为目标节点
this.head = this.head.next;
return;
}
ListNode cur = this.head;
while (cur.next != null){
if (cur.next.val == key){
cur.next = cur.next.next;
return;
}
cur = cur.next;
}
System.out.println("未找到该节点");
}
//删除所有值为key的节点
public ListNode removeAllKey(int key){
if (this.head == null) return null;
ListNode prev = this.head;
ListNode cur = this.head.next;
while (cur != null){
if (cur.val == key){
prev.next = cur.next;
cur = cur.next;
} else{
prev = cur;
cur = cur.next;
}
}
//最后处理头
if (this.head.val == key){
this.head = this.head.next;
}
return this.head;
}
//清空链表
public void clear(){
//this.head = null;//暴力解决 - 不推荐但没毛病
while (this.head != null){
ListNode curNext = this.head.next;
this.head.next = null;
this.head = curNext;
}
}
}
到此这篇关于Java数据结构之链表的增删查改详解的文章就介绍到这了,更多相关Java链表增删查改内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
沃梦达教程
本文标题为:Java数据结构之链表的增删查改详解
基础教程推荐
猜你喜欢
- springboot自定义starter方法及注解实例 2023-03-31
- java基础知识之FileInputStream流的使用 2023-08-11
- Java实现线程插队的示例代码 2022-09-03
- Java实现查找文件和替换文件内容 2023-04-06
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- java实现多人聊天系统 2023-05-19
- Java数据结构之对象比较详解 2023-03-07
- Java文件管理操作的知识点整理 2023-05-19
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- Java并发编程进阶之线程控制篇 2023-03-07