IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LinkedList常用方法探究 -> 正文阅读

[数据结构与算法]LinkedList常用方法探究

LinkedList底层是链表,所以有头指针和尾指针,在一个Node节点的头和尾需要指向下一个被链接的元素

流程图:

·new?LinkedList();

public LinkedList() {
}

·add(E e);

public boolean add(E e) {
    linkLast(e);
    return true;
}

?将新增的节点添加到最后一个节点之后

void linkLast(E e) {
        //last是一个全局变量,指向最后一个节点,第一次新增的时候,last为null,所以l也为null
        final Node<E> l = last;
        // newNode    null<--"a1"-->null
        // 创建一个e的Node节点,前置指向原last节点,后置指向null
        final Node<E> newNode = new Node<>(l, e, null);
        // 将newNode节点赋值为last节点
        last = newNode;
        //  l=null
        if (l == null) {
            // first也是一个全局变量,指向头结点,如果是第一个添加的元素,则first指针指向该结点
            first = newNode; // first指向newNode
        } else {
            //如果不是第一个添加进来的元素,则更新l的后置结点指向新添加的元素结点newNode
            l.next = newNode;
        }
        size++; //记录长度
        modCount++; // 记录修改次数
    }

?Node长这样↓:

private static class Node<E> {
    E item; // 结点元素
    Node<E> next; // 后置结点指针,记录下一个节点位置
    Node<E> prev; // 前置结点指针,记录上一个节点
    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
}

·remove(int index)

public E remove(int index) {
    // 校验传入的参数index是否超出了数组的最大下标且下标不为负数,如果超出,则抛出:IndexOutOfBoundsException异常
    checkElementIndex(index);
    // node(index)返回需要删除的结点
    return unlink(node(index)); // 断开待删除结点的链接 
}

private void checkElementIndex(int index) {
    if (!isElementIndex(index)) {
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    }
}

private boolean isElementIndex(int index) {
    return index >= 0 && index < size;
}

根据index查找Node

Node<E> node(int index) {
    // assert isElementIndex(index);
    // 如果需要获取的index小于总长度size的一半,则从头部开始向后遍历查找
    if (index < (size >> 1)) {
        Node<E> x = first;
        for (int i = 0; i < index; i++) {
            x = x.next; // 从first结点向后next查找,直到index下标node,返回node
        }
        return x;
    } else { // 从尾部开始向前遍历查找
        Node<E> x = last;
        for (int i = size - 1; i > index; i--) {
            x = x.prev; // 从last结点向前prev查找,直到index下标node,返回node
        }
        return x;
    }
}
E unlink(Node<E> x) {
    // assert x != null;
    final E element = x.item;
    final Node<E> next = x.next;
    final Node<E> prev = x.prev;
    /** x.prev为null,表示x结点为第一个元素*/
    if (prev == null) {
        first = next; // 更新first头指针为x结点的后置结点
    } else {
        prev.next = next; // 将x的前置结点与x的后置结点相连接
        x.prev = null; // 断开x的前置指针
    }
    /** x.next为null,表示x结点为最后一个元素*/
    if (next == null) {
        last = prev;
    } else {
        next.prev = prev; // 将x的后置结点与x的前置结点相连接
        x.next = null; // 断开x的后置指针
    }
    x.item = null;
    size--;
    modCount++;
    return element;
}

**************此文章只是本人学习过程中的学习笔记,不做其他用途,如果有其他意见,欢迎一起讨论,谢谢,侵删*************************

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-27 14:21:50  更:2021-09-27 14:24:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 14:44:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码