数据结构--链表

一.什么是链表?

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

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

二.链表的结构

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

下面是节点定义:

这里以 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;
    }
相关推荐
yuanmenghao12 分钟前
CAN系列 — (8) 为什么 Radar Object List 不适合“直接走 CAN 信号”
网络·数据结构·单片机·嵌入式硬件·自动驾驶·信息与通信
一条大祥脚26 分钟前
26.1.3 快速幂+容斥 树上dp+快速幂 带前缀和的快速幂 正序转倒序 子序列自动机 线段树维护滑窗
数据结构·算法
2301_7806698629 分钟前
List(特有方法、遍历方式、ArrayList底层原理、LinkedList底层原理,二者区别)
java·数据结构·后端·list
王老师青少年编程38 分钟前
信奥赛C++提高组csp-s之二分图
数据结构·c++·二分图·csp·信奥赛·csp-s·提高组
Zzz不能停43 分钟前
堆排序算法及大小堆区别
数据结构·算法
冰冰菜的扣jio1 小时前
Redis高级数据结构
数据结构·redis·bootstrap
多米Domi0111 小时前
0x3f 第25天 黑马web (145-167)hot100链表
数据结构·python·算法·leetcode·链表
一起养小猫1 小时前
LeetCode100天Day12-删除重复项与删除重复项II
java·数据结构·算法·leetcode
一起努力啊~1 小时前
算法刷题--螺旋矩阵II+区间和+开发商购买土地
数据结构·算法·leetcode
ID_180079054735 小时前
小红书笔记详情API接口基础解析:数据结构与调用方式
数据结构·数据库·笔记