数据结构入门——线性表:顺序表与链表
数据结构是计算机专业的核心基础课也是 408 考研的第一门专业课。这一篇从最基础的线性表开始把顺序表和链表讲透。一、什么是线性表线性表Linear List是最基本、最常用的数据结构。简单说就是一组数据排成一条线元素1 → 元素2 → 元素3 → ... → 元素N每个元素都有唯一的前驱前一个元素和唯一的后继后一个元素第一个元素没有前驱最后一个没有后继。生活中的例子排队买奶茶的队伍 → 线性表高中座位表 → 线性表手机通讯录 → 线性表线性表的两种存储方式顺序表用连续的内存空间存储类似数组链表用不连续的内存空间存储靠指针连接二、顺序表数组1. 什么是顺序表顺序表就是把元素按顺序存放在连续的内存空间中。在 Java 中就是ArrayList在 C 中就是数组。内存地址 100 101 102 103 104 105 106 ┌────┬────┬────┬────┬────┬────┬────┐ 数据 │ 10 │ 20 │ 30 │ 40 │ 50 │ │ │ └────┴────┴────┴────┴────┴────┴────┘ 下标 0 1 2 3 4 5 6顺序表的三个核心属性publicclassArrayListE{privateObject[]data;// 存储数据的数组privateintsize;// 当前元素个数privateintcapacity;// 数组总容量 data.length}2. 顺序表的基本操作查找随机访问——O(1)// 按下标访问直接通过地址偏移计算publicEget(intindex){if(index0||indexsize){thrownewIndexOutOfBoundsException();}return(E)data[index];}为什么是 O(1)数组在内存中是连续存储的data[i]的地址 起始地址 i × 每个元素大小。一步就能定位。插入——O(n)// 在指定位置插入元素publicvoidadd(intindex,Eelement){// 1. 检查下标范围if(index0||indexsize)thrownewIndexOutOfBoundsException();// 2. 检查容量是否够不够就扩容if(sizedata.length){grow();// 扩容为原来的 1.5 倍}// 3. 将 index 及以后的元素后移一位这是最耗时的for(intisize;iindex;i--){data[i]data[i-1];}// 4. 插入新元素data[index]element;size;}初始 [10, 20, 30, 40, _] ↑ 空位 在下标 1 处插入 15 第一步元素后移 [10, 20, 30, 40, _] → [10, 20, 30, _, 40] [10, 20, 30, _, 40] → [10, 20, _, 30, 40] [10, 20, _, 30, 40] → [10, _, 20, 30, 40] 第二步插入 15 [10, 15, 20, 30, 40]最坏情况在头部插入所有元素都要后移 → O(n)删除——O(n)publicEremove(intindex){if(index0||indexsize)thrownewIndexOutOfBoundsException();EoldValue(E)data[index];// 将 index 后面的元素前移for(intiindex;isize-1;i){data[i]data[i1];}data[size-1]null;// 清空引用帮助 GCsize--;returnoldValue;}最坏情况删除头部元素所有元素前移 → O(n)三、链表1. 什么是链表链表的元素不连续存储每个元素是一个节点Node节点之间通过指针连接。classNode{intdata;// 数据域Nodenext;// 指针域指向下一个节点}内存中不连续的位置 [10 | 地址A] → [20 | 地址B] → [30 | 地址C] → [40 | null] ↑ ↑ 头指针 head 最后一个节点指向 null链表只需要记住头节点head的位置就能找到所有节点。2. 单向链表基本操作查找——O(n)publicNodeget(intindex){Nodecurrenthead;for(inti0;iindex;i){if(currentnull)thrownewIndexOutOfBoundsException();currentcurrent.next;}returncurrent;}为什么是 O(n)链表不是连续的不能直接算地址必须从头节点一个一个往后找。插入——O(1)已知位置// 在 node 节点后面插入一个新节点publicvoidinsertAfter(Nodenode,intdata){NodenewNodenewNode(data);newNode.nextnode.next;// 新节点指向 node 的后继node.nextnewNode;// node 指向新节点}插入前 A → B → C ↑ 在A后面插入 插入步骤 1. newNode.next A.next → new指向B 2. A.next newNode → A指向new 结果 A → new → B → C关键如果已经有了要插入位置的前驱节点插入操作本身只需要改两次指针和表长无关 →O(1)删除——O(1)已知前驱publicvoiddeleteAfter(Nodenode){if(node.next!null){node.nextnode.next.next;// 跳过要删除的节点}}四、顺序表 vs 链表的对比操作顺序表ArrayList链表LinkedList按下标访问O(1) 直接算地址O(n) 从头遍历头部插入O(n) 所有元素后移O(1) 改头指针尾部插入O(1)不需要扩容时O(n) 找到尾部再插中间插入O(n) 移动元素O(1)已知前驱时头部删除O(n) 所有元素前移O(1) 改头指针尾部删除O(1) 直接删O(1) 双向链表 / O(n) 单向内存占用连续空间省内存每个节点多存一个指针内存分配一次性分配动态分配按需创建选型建议频繁按下标访问查多 → 顺序表ArrayList 频繁头尾增删改多 → 链表LinkedList 实际开发中ArrayList 用得更普遍因为查询的需求远多于插入删除。五、408 考研常见考题题1顺序表插入的平均移动次数在长度为 n 的顺序表中插入一个元素平均需要移动多少个元素 在位置 0 插入 → 移动 n 个 在位置 1 插入 → 移动 n-1 个 ... 在位置 n 插入 → 移动 0 个 平均移动次数 (0 1 2 ... n) / (n1) n/2答案平均移动n/2个元素。题2链表插入的时间复杂度在单链表的第 i 个位置插入一个节点时间复杂度是多少 注意插入操作本身是 O(1)但找到第 i 个位置需要 O(n) 所以总的时间复杂度是 O(n)题3手写链表反转publicNodereverse(Nodehead){Nodeprevnull;Nodecurrenthead;while(current!null){Nodenextcurrent.next;// 先存下一个节点current.nextprev;// 指向前一个prevcurrent;// prev 后移currentnext;// current 后移}returnprev;// prev 是新的头节点}过程图解初始 1 → 2 → 3 → 4 → null 第1步 null ← 1 2 → 3 → 4 → null prev current 第2步 null ← 1 ← 2 3 → 4 → null prev current 第3步 null ← 1 ← 2 ← 3 4 → null prev current 第4步 null ← 1 ← 2 ← 3 ← 4 prev current→null 结果 4 → 3 → 2 → 1 → null这道题面试和考研都很经典建议能手写出来。六、Java 中对应的集合类// 顺序表基于数组ListStringarrayListnewArrayList();arrayList.add(A);// 尾部添加 O(1)arrayList.get(0);// 按下标查 O(1)arrayList.add(0,B);// 头部插入 O(n)// 链表基于双向链表ListStringlinkedListnewLinkedList();linkedList.add(A);// 尾部添加 O(1)linkedList.get(0);// 按下标查 O(n)linkedList.add(0,B);// 头部插入 O(1)总结线性表 排成一排的数据 顺序表 连续存放数组查得快改得慢 链表 节点通过指针连接改得快查得慢考研重点顺序表的插入/删除平均移动次数、链表反转、顺序表和链表的复杂度对比。 觉得有用的话点赞 关注【张老师技术栈】吧每周更新 Java/Python/爬虫/数据结构 实战干货不让你白来。

相关新闻

内容审核不是功能模块,而是数字产品的免疫系统

内容审核不是功能模块,而是数字产品的免疫系统

1. 项目概述:这本《内容审核实战指南》不是理论手册,而是我拆解过27个真实业务线、踩过43次规则雷区后整理出的“防翻车操作清单”“内容审核”这四个字听起来像后台系统里一个安静的开关——点一下,敏感词过滤;再点一下&#xff…

2026/6/30 19:16:05阅读更多 →
MoE混合专家模型原理与实战:稀疏激活如何平衡大模型规模与计算效率

MoE混合专家模型原理与实战:稀疏激活如何平衡大模型规模与计算效率

1. 项目概述:当“参数规模”不再等于“实际计算量” 你可能已经看过不少标题党文章,比如“GPT-4参数量突破1.8万亿!”——但真正值得细品的,是后半句:“它每处理一个词(token),只动用…

2026/6/30 19:16:05阅读更多 →
计算机毕业设计之基于若依平台的工程养护资料管理系统设计与实现

计算机毕业设计之基于若依平台的工程养护资料管理系统设计与实现

在当今工程建设规模持续扩大、养护工作复杂度不断攀升的背景下,传统的工程养护资料管理方式暴露出诸多弊端。资料分散存储在不同部门与人员手中,导致信息难以整合与共享,检索查阅极为不便;同时,管理流程缺乏规范化&…

2026/6/30 19:11:00阅读更多 →
AI代理运行时基础设施:可审计、可恢复的生产级Agent Runtime

AI代理运行时基础设施:可审计、可恢复的生产级Agent Runtime

1. 这不是新赛道,是 runtime 层的“操作系统时刻”来了你有没有在深夜调试一个跑了三小时的 AI 代理,突然发现它开始胡言乱语?不是模型崩了,不是 prompt 写错了,而是——它的“记忆”被挤掉了。上下文窗口就那么大&…

2026/6/30 20:26:18阅读更多 →
大模型MoE架构原理与工程实践:理解专家激活率与显存优化

大模型MoE架构原理与工程实践:理解专家激活率与显存优化

1. 这不是“参数越多越强”的简单故事:拆解大模型里那个被悄悄激活的“专家小组”你肯定听过类似说法:“GPT-4有1.8万亿参数”——这个数字像一枚勋章,挂在所有AI新闻的标题栏上。但真正让这件事变得有意思、甚至有点反直觉的,是后…

2026/6/30 20:26:18阅读更多 →
Selenium弹框定位全攻略:原生Alert与自定义模态框处理方案

Selenium弹框定位全攻略:原生Alert与自定义模态框处理方案

1. 项目概述:Selenium弹框定位的“老大难”问题做UI自动化测试或者网页数据抓取的朋友,只要用过Selenium,十有八九都遇到过弹框定位这个“拦路虎”。你写好的脚本,在页面上跑得正欢,突然一个弹框(Alert、Co…

2026/6/30 20:26:18阅读更多 →
mavonEditor终极指南:从零开始打造你的Vue Markdown编辑器

mavonEditor终极指南:从零开始打造你的Vue Markdown编辑器

mavonEditor终极指南:从零开始打造你的Vue Markdown编辑器 【免费下载链接】mavonEditor mavonEditor - A markdown editor based on Vue that supports a variety of personalized features 项目地址: https://gitcode.com/gh_mirrors/ma/mavonEditor 还在为…

2026/6/30 20:26:18阅读更多 →
Playwright自动化测试:从核心原理到实战框架搭建指南

Playwright自动化测试:从核心原理到实战框架搭建指南

1. 项目概述:为什么是Playwright?如果你在过去几年里做过Web自动化测试,大概率用过或者听说过Selenium。它像一位功勋卓著的老将,开创了一个时代,但也背负着沉重的历史包袱——浏览器驱动版本管理、不稳定的等待、跨浏…

2026/6/30 20:26:18阅读更多 →
霞鹜文楷:如何用一款开源字体解决中文排版三大痛点?

霞鹜文楷:如何用一款开源字体解决中文排版三大痛点?

霞鹜文楷:如何用一款开源字体解决中文排版三大痛点? 【免费下载链接】LxgwWenKai An unprofessional open-source Chinese font derived from Fontworks Klee One. 一款非专业的开源中文字体,基于 FONTWORKS 出品字体 Klee One 衍生。 项目…

2026/6/30 20:21:18阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/30 4:03:30阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/30 4:36:27阅读更多 →
为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南

为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南

为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南 【免费下载链接】Destiny-2-Solo-Enabler Repo containing the C# and XAML code for the D2SE program. Included is also the dependency for the program, and image asset. 项目地址: https://gitcode…

2026/6/30 0:02:58阅读更多 →
第六章:PowerPoint 2010 核心功能与实战应用 —— 从入门到精通

第六章:PowerPoint 2010 核心功能与实战应用 —— 从入门到精通

1. PowerPoint 2010基础操作全攻略 刚接触PowerPoint 2010时,很多人会被它复杂的界面吓到。其实只要掌握几个核心区域,就能快速上手。我最开始用PPT时,经常找不到功能按钮在哪,后来发现主要操作都集中在顶部功能区。 工作窗口主要…

2026/6/30 0:02:58阅读更多 →
XGBoost超参数实战:从理论到调优策略

XGBoost超参数实战:从理论到调优策略

1. XGBoost超参数基础认知 第一次接触XGBoost时,我被它那密密麻麻的参数列表吓到了。这感觉就像面对一架波音747的驾驶舱——每个按钮都可能有神奇的效果,但按错了就可能坠机。经过多年实战,我发现其实掌握十几个核心参数就能解决90%的问题。…

2026/6/30 0:02:59阅读更多 →