3.5链表----链表中元素的删除(只删除一个元素情况)

该部分与上一节是息息相关的,关于如何在链表中删除元素,我们一步一步来分析:

一、图示删除逻辑

假设我们需要在链表中删除索引为2位置的元素,此时链表结构为:

若要删除索引为2位置的元素,需要获取索引为2位置的元素之前的前置节点(此时为索引为1的位置的元素),因此我们需要设计一个变量prev来记录前置节点。

1.初始时变量prev指向虚拟头结点dummyHead:

2.寻找到前置节点位置,(对于该例子前置节点为索引为1的位置的元素)。

则此时prev记录的next即为需要删除的节点,记为delNode变量。

3.删除操作

第一步:将prev的next指向delNode的next,如图:

代码为:

prev.next=delNode.next;

第二步:为了java能够回收这个被删除的空间,我们手动让需要被删除的节点从链表中脱离开来,也就是delNode的next变为null。

代码为:

delNode.next=null;

二、代码实现删除逻辑

2.1 从链表删除第index(0-based)个位置的元素 ,返回删除的元素

首先,初始化当前前置节点指向虚拟头结点,然后遍历寻找到需要被删除节点的前置节点,最后执行删除逻辑。

//从链表删除第index(0-based)个位置的元素 ,返回删除的元素  (实际不常用,练习用)public E remove(int index) {if (index < 0 || index >= size) {throw new IllegalArgumentException("remove failed,Illegal index");}//获取虚拟头节点Node<E> prev = dummyHead;for (int i = 0; i < index; i++) {//获取到删除元素之前节点prev = prev.next;}Node<E> retNode = prev.next;//被删除的元素prev.next = retNode.next;retNode.next = null;size--;return retNode.e;}

2.2 从链表中删除第一个元素,返回删除的元素

基于remove(int index)方法实现该方法:

//从链表中删除第一个元素,返回删除的元素public E removeFirst() {return remove(0);}

2.3 从链表中删除最后一个元素,返回删除的元素

基于remove(int index)方法实现该方法:

//从链表中删除最后一个元素,返回删除的元素public E removeLast() {return remove(size - 1);}

三、测试删除逻辑

基于上一节的测试代码,我们新增删除逻辑代码,此时贴出全部测试代码:

package LinkedList;public class TestMain {public static void main(String[] args) {LinkedList<Integer> linkedList = new LinkedList<Integer>();System.out.println("============在链表头部添加============");for (int i = 0; i < 5; i++) {linkedList.addFirst(i);System.out.println(linkedList);}System.out.println("============修改链表============");linkedList.set(2, 666);System.out.println(linkedList);System.out.println("============删除链表中666节点============");linkedList.remove(2);System.out.println(linkedList);}
}

结果为:

四、链表的时间复杂度分析

4.1 添加操作的时间复杂度

(1)在链表尾部添加(addLast())需要从头遍历,时间复杂度为O(n);

(2)在链表头部添加(addFirst()),时间复杂度为O(1);

(3)在链表任意位置添加(add(int index,E e)),平均情况下为O(n/2)=O(n);

4.2 删除操作的时间复杂度

(1)删除链表最后一个元素(removeLast()),需要遍历找到最后元素的前一个元素,故时间复杂度为O(n);

(2)删除链表的第一个元素(removeFirst()),时间复杂度为O(1)

(3)删除链表中任意位置节点(remove(index)),平均情况下时间复杂度为O(n/2)=O(n);

4.3 修改操作

由于链表不支持随机访问,需要从头开始寻找直到找到需要修改的节点,故时间复杂度为O(n)

4.4 查找操作

由于链表不支持随机访问,需要从头开始寻找直到找到需要的节点,故时间复杂度为O(n)

从上不难看出,关于链表的添加操作、删除操作、修改操作、查找操作的时间复杂度均为O(n),看到这个顿时心凉了半截,这个还搞个mao,还不如数组呢,其实确实是这样的,因为对于数组来说,只要有索引即可实现快速访问。但是对于链表来说,我们如果只对链表头进行添加操作、删除操作、查找操作那么它的的时间复杂度为均O(1),这时和数组是一样,是动态的,不会大量的浪费内存空间,这就是它的优势,由于链表是最基础的动态数据结构,在此基础上将会有更多关于链表的应用。

关于本小节,若您觉得还行、还过得去,麻烦给个推荐吧,谢谢!!

关于链表的源码 https://github.com/FelixBin/dataStructure/tree/master/src/LinkedList

posted on 2019-04-02 15:52 WFaceBoss 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/wfaceboss/p/10642754.html

3.5链表----链表中元素的删除(只删除一个元素情况)相关推荐

  1. Python编程语言学习:列表与字典互转的几大方法集锦、从列表中按顺序循环抽走一个元素输出剩余元素之详细攻略

    Python编程语言学习:列表与字典互转的几大方法集锦.从列表中按顺序循环抽走一个元素输出剩余元素之详细攻略 目录 列表与字典互转的几大方法集锦 T1.基于两个列表利用zip函数来构造字典 <

  2. 在顺序表中第五个位置插入一个元素9,实现顺序表插入的基本操作,输出顺序表中所有元素

    题目 在顺序表中第五个位置插入一个元素9,实现顺序表插入的基本操作,输出顺序表中所有元素 #include<iostream>using namespace std; #define OK ...

  3. 【Groovy】集合遍历 ( 操作符重载 | 集合中的 “ << “ 操作符重载 | 使用集合中的 “ << “ 操作符添加一个元素 | 使用集合中的 “ << “ 操作符添加一个集合 )

    文章目录 一.集合中的 " << " 操作符重载 1.使用集合中的 " << " 操作符添加一个元素 2.使用集合中的 " & ...

  4. 在Python中为什么切片要忽略最后一个元素?

    在切片和区间操作里不包含区间范围的最后一个元素是Python 的风格,这个习惯符合Python C和其他语言里以0作为起始下标的传统. 当只有最后一个位置信息时,我们也可以快速看出切片和区间里有一个元 ...

  5. 删除数组最后一个元素

    题目描述 删除数组 arr 最后一个元素.不要直接修改数组 arr,结果返回新的数组 示例1 输入 [1, 2, 3, 4] 输出 [1, 2, 3] 1.利用数组的length function t ...

  6. 如何从Set中任意(随机)取出一个元素

    从set中取元素没有类似set.get()的方法,只能用set.iterator()或for(Object o : set){...} 第二种方式本质还是set.iterator() 用set.ite ...

  7. php数组选择随机元素,php 数组随机选择一个元素显示的简单示例

    这篇文章主要为大家详细介绍了php 数组随机选择一个元素显示的简单示例,具有一定的参考价值,可以用来参考一下. 本代码演示了如何从php数组中随机选择一个元素显示,感兴趣的小伙伴,下面一起跟随512笔 ...

  8. f函数java_Java流:对N-1个元素执行f(),对N个元素执行g(),即,最后一个元素使用不同的函数...

    有没有一种方法可以调用Java流API,以对Iterable的最后一个元素(除了最后一个元素)执行所有功能,然后在最后一个元素上调用另一个元素而又不将其拆分为两个单独的调用? 这样可以节省两次遍历,一 ...

  9. python创建只包含一个元素的元组时_Python 创建包含列表的元组

    "可变"的tuple 前面我们看到了tuple一旦创建就不能修改.现在,我们来看一个"可变"的tuple: >>> t = ('a', 'b' ...

最新文章

  1. ggplot2 图形排版:patchwork 包复杂排版
  2. GO select用法详解
  3. 产品经理必备的14大效率工具
  4. DVWA---文件包含
  5. wxWidgets:实时传输时间RTTI
  6. leetcode64. 最小路径和(dp)
  7. catia测量工具小尺子在哪_小区垃圾桶旁捡来旧茶几,老爸巧手改成沙发,邻居一个劲问哪买的...
  8. 2016杭州ccpc
  9. 不为人知的心理学效应
  10. 【Kafka】Kafka集群 动态 添加 节点 可行否
  11. 微信抢红包插件与Android辅助功能
  12. 【Datawhale IntelVINO学习笔记】OpenVINO音频和人体姿态识别
  13. Matlab笔记之符号运算中的矩阵转置
  14. 加深 | Matlab图像实验操作基础(矩阵,九宫格、噪声处理)
  15. vmware 详细安装教程
  16. word转简洁html工具,Convert Word to HTML(Word转HTML工具)
  17. 基于51单片机的手机电话拨号盘模拟protues仿真
  18. Thinkpad L430无法识别Trackpoint解决方案
  19. 基于51单片机的知识
  20. apipost中文版

热门文章

  1. Permission denied的解决办法
  2. Linux C 存储映射IO
  3. 二维数组子数组矩形和
  4. springboot系列四、配置模板引擎、配置热部署
  5. 通过Small Basic把儿子/女儿带入编程的世界
  6. 让Terminal显示git分支
  7. Party Lamps chapter 2.2
  8. Mac OS 看机起动JIRA
  9. 长三角,也开始“东北化”了
  10. 戳破“砖家”假面:唯快不破的时代,为什么这件事一定要慢慢做?