数据结构--链表

一.什么是链表?

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

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

二.链表的结构

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

下面是节点定义:

这里以 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;
    }
相关推荐
罗湖老棍子15 小时前
【例 1】Sightseeing Trip(信息学奥赛一本通- P1494)(洛谷-P10927)
数据结构·算法·图论·最短路·floyd·最小环
郝亚军18 小时前
manifest 中 `sha256` 与 `signValue` 的作用
java·开发语言·数据结构
Nil20819 小时前
LeetCode 283移动零
数据结构·算法·leetcode
库玛西21 小时前
外部排序全解析:败者树、置换-选择排序与最佳归并树
c语言·数据结构·c++·笔记·考研·算法
花间相见1 天前
【计算基础|MySQL08】索引(上):为什么是 B+ 树
数据结构·mysql·算法·架构
夊1 天前
数据结构第二课:顺序表揭秘
数据结构
OKkankan1 天前
python 进阶(三):面向对象进阶——从“会写 class”到设计可维护的后端对象
开发语言·数据结构·python
闻缺陷则喜何志丹1 天前
vc入门宝典(九)
数据结构·list·mfc·存储·null·class
quaer2 天前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法
xys_6782 天前
深挖数据结构:树和二叉树(上)
数据结构·算法