数据结构--链表

一.什么是链表?

链表是一种用于存储数据的数据结构,通过如链条一般的指针来连接元素。它的特点是插入与删

除数据十分方便,但寻找与读取数据的表现欠佳。

二.链表的结构

链表的核心是节点。一般节点包括数值部分和指针部分。

下面是节点定义:

这里以 LeetCode 中的题目为例:

java 复制代码
public class ListNode {

    public int val;//数值部分

    public ListNode next;

    public ListNode() {

    }
    public ListNode(int val) {
        this.val = val;
    }

    @Override
    public String toString() {
        return "ListNode{" +
                "val=" + val +
                ", next=" + next +
                '}';
    }
}

链表之间是通过指针相连,所以不需要像数组那样需要申请连续的一段空间,但是链表是没有索引的,所以查询连表中的某个节点就必须从头开始遍历链表找,所以查询速度没有数组快,但是对于中间节点的插入和删除,只需要断开连接部分,重新连接即可实现链表新节点的添加和删除,所以增删快。

三.链表增加数据

1.头插法

在链表头部插入数据。

java 复制代码
    //头插法
    public void addFirst(int val) {
        ListNode newNode=new ListNode(val);
        if(head!=null){
            newNode.next=head;
        }
        head=newNode;
        size++;//链表长度
    }

2.尾插法

在链表尾部插入数据

java 复制代码
    public void addLast(int val) {
        ListNode newNode=new ListNode(val);
        //如果头指针为空,那么新节点就是头节点
        if(Objects.isNull(head)){
            head=newNode;
        }else{
            ListNode curr=head;
            while (curr.next!=null){
                curr=curr.next;
            }
            curr.next=newNode;
        }
        size++;
    }

3.在中间位置添加元素

java 复制代码
    public void add(int index, int val) {
        //在第一个位置添加节点,可以直接调用addFirst()
        if(index==0){
            addFirst(val);
        }
        if(index<0 || index>=size){
            throw new MyLinkException("索引越界");
        }
        ListNode curr=head;
        ListNode newNode=new ListNode(val);
        //这里因为是要拿到插入位置的前一个节点,又因为语句中是 curr=curr.next; 所以这里循环只需要到 index-1
        for (int i = 0; i < index - 1; i++) {
            curr=curr.next;
        }
        newNode.next=curr.next;
        curr.next=newNode;
        size++;
    }

四.链表删除数据

1.删除头节点

java 复制代码
    public void removeFirst() {
        head=head.next;
        size--;
    }

2.根据索引位置删除

java 复制代码
    public void remove(int index) {
        ListNode first=head;
        ListNode target;
        ListNode second;
        for (int i = 0; i < index - 1; i++) {
            first=first.next;
        }
        target=first.next;
        second=target.next;
        first.next=second;
        target.next=null;
        size--;
    }

3.根据值删除

java 复制代码
Node pre = head;
 if (data == head.data) {
    removeFirst();
    return true;
    }
if (pre == null) throw new LinkedException("空链表删除失败");
 while (pre.next != null) {
     if (pre.next.data == data) {
     Node target = pre.next;
     Node next = target.next;
     pre.next = next;
     target.next = null;
    return true;
    }
 pre = pre.next;
  }
return false;

五.链表查找元素

1.根据索引查找

java 复制代码
    public int get(int index) {
        ListNode curr=head;
        for (int i = 0; i < index; i++) {
            curr=curr.next;
        }
        return curr.val;
    }

2.根据数据查找

java 复制代码
    public int indexof(int val) {
        ListNode curr=head;
        if(curr.val==val){
            return 0;
        }
        int index=0;
        for (int i = 0; i < size; i++) {
            if(curr.val==val){
                return index;
            }
            index++;
            curr=curr.next;
        }
        return index;
    }

六.链表修改节点

java 复制代码
    public void set(int index, int val) {
        if(index<0 || index>size){
            new MyLinkException("索引异常");
        }
        ListNode curr=head;
        for (int i = 0; i < index; i++) {
            curr=curr.next;
        }
        curr.val=val;
    }
相关推荐
空中海31 分钟前
Redis 从零到精通:9大数据结构 × 11个高频工程实战场景完全手册
数据结构·数据库·redis
地球资源数据云1 小时前
1951-2025年中国逐年1千米逐月总降水量区域统计数据集_年表_县
大数据·数据结构·数据库·数据仓库·人工智能
cpp_25013 小时前
P2639 [USACO09OCT] Bessie‘s Weight Problem G
数据结构·算法·动态规划·题解·洛谷·背包dp
郝学胜-神的一滴3 小时前
[力扣 227] 双栈妙解表达式计算:从思维逻辑到C++实战,吃透反向波兰式底层原理
java·前端·数据结构·c++·算法
菜鸟丁小真3 小时前
LeetCode hot100 -131.分割回文串
数据结构·算法·leetcode·知识点总结
数智化精益手记局4 小时前
8d报告案例分析:拆解8d报告案例分析的8个步骤,解决生产现场重复发生的质量难题
大数据·数据结构·数据库·人工智能·精益工程
笨笨饿4 小时前
66_C语言与微控制器底层开发
linux·c语言·网络·数据结构·算法·机器人·个人开发
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题】【Java基础篇】第10题:HashMap中的元素是有序存放的吗
java·开发语言·数据结构·后端·面试·哈希算法·哈希表
牢姐与蒯4 小时前
c++数据结构之二叉搜索树
数据结构·c++·搜索
会编程的土豆5 小时前
【数据结构与算法】新二叉树
数据结构·算法·二叉树