LinkedList工作原理及实现

2023-11-02

以双向链表实现。链表无容量限制,但双向链表本身使用了更多空间,也需要额外的链表指针操作。

按下标访问元素—get(i)/set(i,e) 要悲剧的遍历链表将指针移动到位(如果i>数组大小的一半,会从末尾移起)。

插入、删除元素时修改前后节点的指针即可,但还是要遍历部分链表的指针才能移动到下标所指的位置,只有在链表两头的操作—add(), addFirst(),removeLast()或用iterator()上的remove()能省掉指针的移动。

LinkedList是一个简单的数据结构,与ArrayList不同的是,他是基于链表实现的。

 set和get函数

1
2
3
4
5
6
7
8
9
10
11
12
public E set( int index, E element) {
     checkElementIndex(index);
     Node<E> x = node(index);
     E oldVal = x.item;
     x.item = element;
     return oldVal;
}
 
public E get( int index) {
     checkElementIndex(index);
     return node(index).item;
}

这两个函数都调用了node函数,该函数会以O(n/2)的性能去获取一个节点,具体实现如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Node<E> node( int index) {
     // assert isElementIndex(index);
 
     if (index < (size >> 1 )) {
         Node<E> x = first;
         for ( int i = 0 ; i < index; i++)
             x = x.next;
         return x;
     } else {
         Node<E> x = last;
         for ( int i = size - 1 ; i > index; i--)
             x = x.prev;
         return x;
     }
}

就是判断index是在前半区间还是后半区间,如果在前半区间就从head搜索,而在后半区间就从tail搜索。而不是一直从头到尾的搜索。如此设计,将节点访问的复杂度由O(n)变为O(n/2)。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LinkedList工作原理及实现 的相关文章

随机推荐

  • JavaScript 面试题(核心基础类)

    面试题按类型来分 主要涉及到 技术 与 非技术 两大类 今天我们主要讨论的是 技术类 在这个大类别下涉及到的子类别有 移动 PC端布局类 JavaScript 核心基础类 衍生框架类 项目应用类 JavaScript 核心基础类面试题 一
  • mediawiki使用中遇到的两个问题

    1 禁止新用户自行注册 我的wiki版本是1 22 5的 最近想禁用掉用户注册的功能 网上百度了一下都是 在LocalSettings php中加入 Prevent new user registrations wgWhitelistAcc
  • 最小二乘法拟合圆公式推导及其实现

    1 1最小二乘拟合圆介绍与推导 最小二乘法 least squares analysis 是一种数学优化技术 它通过最小化误差的平方和找到一组数据的最佳函数匹配 最小二乘法是用最简的方法求得一些绝对不可知的真值 而令误差平方之和为最小来寻找
  • 在线教育录播视频防下载安全测试 _EduSoho_HLS(m3u8)

    基于测试某录播课平台视频安全性的需求 对平台上的免费视频进行安全测试 看看到底能否较好的防下载 以下为几种常用的视频加密技术 我们这次的测试平台采用的是第二种 第三种方式主要依靠专用播放器来解决数据交到客户端的这一环的安全性 但是专用播放器
  • js递归缓存方法

    方法一 普通递归缓存法 function fn n if isFinite n n gt 0 n Math round n 不是无限数 是否大于0 取整 if n in fn 是否在fn缓存内 if n lt 1 当n 1时 结果为1 re
  • mysql 索引相关,什么时候该使用索引,什么时候不使用

    索引为什么能提高数据访问性能 很多人只知道索引能够提高数据库的性能 但并不是特别了解其原理 其实我们可以用一个生活中的示例来理解 我们让一位不太懂计算机的朋友去图书馆确认一本叫做 MySQL性能调优与架构设计 的书是否在藏 这样对他说 请帮
  • Qt中UDP通信的简单示例

    udp通信分为发送端和接收端 通信步骤可以分为以下 接收端 创建QUdpSocket对象 在 h文件中添加类的前置声明 定义该类的指针 在 cpp的构造函数中定义指向该类的指针 bind 绑定IP和端口 connect 绑定readyRea
  • 深入理解MongoDB高级架构

    一 MongoDB 索引 MongoDB提供了多样性的索引支持 索引信息被保存在 system indexes 中 且默认总是为 id创建索引 它的索引使用基本和 MySQL 等关系型数据库一样 其实可以这样说说 索引是凌驾于数据存储系统之
  • docker-compose安装redis

    基于docker compose快速安装redis 目录 一 目录结构 1 docker compose yml 2 redis conf 二 连接使用 一 目录结构 1 docker compose yml version 3 servi
  • 安装vm tools时提示本程序需要您将此虚拟机上安装的操作系统更新到SP1

    VMware安装win7后 安装VMware Tools时报错安装程序无法继续 本程序需要您将此虚拟机上安装的操作系统更新到SP1 原因 镜像文件不适合 原版本是 cn windows 7 enterprise x64 dvd x15 70
  • 重装系统蓝屏,电脑开机蓝屏解决方法记录

    电脑开机就kmode exception not handled 并且重装系统进不了pe 出现错误代码 unexpected kernel mode trap 电脑问题详细描述 开机就蓝屏 进不了系统 进不了安全模式 并且电脑会循环开机关机
  • GPT模型系列

    文章目录 1 Mask Multi head Attentiion 2 Generative Pre Traning GPT 3 GPT2 4 GPT3 1 Mask Multi head Attentiion Mask Multi hea
  • php数据库判断登录用户,【判断用户登录】PHP这样判断流程是否正确?每次都查询数据库 存COOKIE...

    我自己来做的PHP判断用户是否登录 流程 1 先判断有没有cookie uid cookie uid 如果没有跳出循环检测 2 如果有 连接数据库查询该uid对应的记录 如果没有改记录则跳出循环检测并且注销所有用户cookie 3 如果有
  • 前k个高频单词

    不要害怕前方的未知和困难 因为它们都是你成长的机会 不要过于在意别人的眼光和评价 因为唯有你的内心才知道自己真正的价值 珍惜当下 享受生活的点滴 让自己变得更加坚强 自信 成熟 作者 不能再留遗憾了 专栏 Java学习 本文章主要内容 前k
  • 星星之火-52:6G十大领域关键技术

    目录 1 6G超宽带通信系统的网络架构 2 6G超宽带通信系统的软件架构 3 太赫兹通信技术 4 6G 信道仿真技术及射线跟踪 5 超大带宽与全频谱协作 6 轨道角动量调制技术 7 宽带太赫兹硬件元器件技术 8 太赫兹天线技术 9 太赫兹射
  • 国产系统有了,芯片有了,编译器有了,那编程语言呢?

    国产操作系统一直在发展 市面上也早有了多款基于Linux内核的操作系统 各大OS厂商也都有自己的市场和拥趸 而芯片这块 虽然我们起步晚 商业市场也显得浮躁纷繁 但依旧有务实的IT科研工作者 工程师为主的企业或团队默默无闻十年磨一剑 苦心孤诣
  • (十三)MySQL数据库安装——从0开始大数据开发实战:电影推荐系统(scala版)

    执行一下命令 安装MySQL sudo apt get update sudo apt get install mysql server 安装过程中会提示设置MySQL数据库root用户的密码 本案例设置密码为hadoop 安装完成后默认启
  • 常用英语缩写

    Abandon简写为ABAN Abandoned简写为ABD Abbreviate简写为ABBR Abbreviated简写为ABR Abbreviation简写为ABR Ability简写为ABL Abundance简写为ABUND Ac
  • 虚幻4学习笔记(4)光照、游戏角色、上下车、冲刺瞬移多段跳、打包

    光照 光照 光照分类 光的移动性 自动曝光 指数级高度雾 生成光束 使用体积雾创建光束 使用天空球制造夜晚 设置玩家角色 设置玩家切换 镜头过度 上下车 上车 下车 下车减速 人物冲刺和瞬移 冲刺 瞬移 多段跳设置 打包 B站UP谌嘉诚课程
  • LinkedList工作原理及实现

    以双向链表实现 链表无容量限制 但双向链表本身使用了更多空间 也需要额外的链表指针操作 按下标访问元素 get i set i e 要悲剧的遍历链表将指针移动到位 如果i gt 数组大小的一半 会从末尾移起 插入 删除元素时修改前后节点的指