数据结构--链表

一.什么是链表?

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

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

二.链表的结构

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

下面是节点定义:

这里以 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;
    }
相关推荐
星星火柴9363 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
艾莉丝努力练剑3 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
闪电麦坤954 小时前
数据结构:迭代方法(Iteration)实现树的遍历
数据结构·二叉树·
Cx330❀5 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
散1125 小时前
01数据结构-Prim算法
数据结构·算法·图论
阿巴~阿巴~6 小时前
深入解析C++ STL链表(List)模拟实现
开发语言·c++·链表·stl·list
..过云雨6 小时前
01.【数据结构-C语言】数据结构概念&算法效率(时间复杂度和空间复杂度)
c语言·数据结构·笔记·学习
拂晓银砾6 小时前
Java数据结构-栈
java·数据结构
旺小仔.7 小时前
双指针和codetop复习
数据结构·c++·算法
楽码8 小时前
底层技术SwissTable的实现对比
数据结构·后端·算法