`
543089122
  • 浏览: 149669 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

图解双链表

阅读更多
以java.util.LinkedList源码结合本人用XP自带的简陋的画图程序分析链表成链的过程如下:

1、一个空的双链表其实是个环形的链,如下图:


public LinkedList() {
        header.next = header.previous = header;
    }


2、添加第一个元素的过程如下:


public boolean add(E o) {
	addBefore(o, header);
        return true;
    }
private Entry<E> addBefore(E o, Entry<E> e) {
	Entry<E> newEntry = new Entry<E>(o, e, e.previous);//①
	newEntry.previous.next = newEntry;   //③
	newEntry.next.previous = newEntry;   //②
	size++;
	modCount++;
	return newEntry;
    }

注意看①处,意思是说新增节点的后驱是header,前驱是header的前驱(header的前驱始终会指向链表的最后一个元素)

3、添加第二个元素如下和添加第一个类似:


--------------------------------------------------
2011-11-02 下午
补充:
private Entry<E> addBefore(E e, Entry<E> entry) {
	Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);//A
	newEntry.previous.next = newEntry;
	newEntry.next.previous = newEntry;
	size++;
	modCount++;
	return newEntry;
    }

这段代码是添加元素到链表的尾部,创建新节点的代码A,如果站在空链表的角度去理解其实并不好理解,如果你站在已经添加了元素的角度来理解就显得容易一些了,如下图:


解释:原来是head和1节点组合成一个环形的链表,现在我要添加元素2,那么addBefore是怎么做的呢?它首先得把绿色的1->head的线分解成2条绿色的带箭头的虚线,然后把红色的head->1的线分解成那2条红色的虚线。
所以newEntry.next = head;
newEntry.pre = head.pre;
连起来写就是A处的代码了。下面2句代码就迎刃而解了。

  • 大小: 5 KB
  • 大小: 22.9 KB
  • 大小: 12.9 KB
  • 大小: 24.3 KB
分享到:
评论

相关推荐

    双向链表API及C语言实现

    所有API实现均为C语言版本,在我的文章《【数据结构】双向链表的API及C语言实现》中有所有API说明和异常分析的图解。另外还有线性表顺序存储、单链表、循环链表的C语言实现,文章及代码资源均已上传,可在专栏《数据...

    单双向链表解读

    图解单双向链表的生成,容易理解。附有代码详解,可以测试其真伪。

    TQCAI#Algorithm#剑指 Offer 36. 二叉搜索树与双向链表1

    剑指 Offer 36. 二叉搜索树与双向链表题解写的比我的简单面试题36. 二叉搜索树与双向链表(中序遍历,清晰图解)

    【超详细图解】菜鸡如何理解双向链表的python代码实现

    近期碰到了双向链表代码实现这块硬骨头,花了半天的时间研究,我终于理解了!现在我将从我这只菜鸡的视角出发,边讲解边画图,来帮助更多和我一样被大量代码虐惨的同学。 双向链表的原理 原创文章 3获赞 1访问量 ...

    【超全!】图解Java数据结构和算法(共195集)【资料+视频+课件+代码+笔记】

    内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、...

    图解 Java 中的数据结构及原理.docx

    最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程。...经典的双链表结构, 适用于乱序插入, 删除. 指定序列操作则性能不如ArrayList, 这也是其数据结构决定的.

    《算法图解》读书笔记-2选择排序(数组与链表)

    补充知识:其实链表分为单链表和双链表(此图出处)。 说出来你可能不信对于链表的介绍就像开玩笑一样的结束了。。。。。。 但是为了加强下印象简单实现个单链表结构,大佬勿喷。。。 class Node(object): def __...

    C语言38个样例设计及其源代码(新)

    牛顿法图解方程 8.屏保程序 9.运动图像程序 10.特殊图像程序 11.窗口菜单显示 12.日期处理 13.日期时间计算 14.工资管理 15.财务管理 16.域名服务器 17.电话簿管理 18.商品库存管理 19.股票交易 20.矩阵旋转反射 21....

    leetcode安卓-LeetCode-Study:leetcode学习记录

    leetcode安卓 学习算法,终生学习. ...双链表实现 双链表实现 双链表实现 树 贪心思想 动态规划 1 1 递归题 各种算法已代码实现 极客时间算法: Common Data Structure Operations 时间复杂度 学习笔记 仅供同学们参考

    leetcode安卓-Data-Structures-and-Algorithms:数据结构和算法

    leetcode安卓 学习算法,终生学习. ...双链表实现 双链表实现 双链表实现 树 贪心思想 动态规划 1 1 递归题 各种算法已代码实现 极客时间算法: Common Data Structure Operations 时间复杂度 学习笔记 仅供同学们参考

    韩顺平java项目源码-data-structures:数据结构学习源码,学习过程中参考尚硅谷的《尚硅谷-韩顺平图解Java数据结构和算法》视

    数据结构学习源码,学习过程中参考尚硅谷的《尚硅谷-韩顺平图解Java数据结构和算法》视频, 但视频中有些内容为了便于理解,存在一些硬编码以及一些个人觉得可以优化的点,因此该项目中源码与视频中源码有较大出入; ...

    MongoDB架构图解

    MongoDB在数据存储上按命名空间来划分,一个collection是一个命名空间,一个索引也是一个命名空间同一个命名空间的数据被分成很多个Extent,Extent之间使用双向链表连接在每一个Extent中,保存了具体每一行的数据,...

    适合小白的python算法-双指针问题

    二分法说明三、链表(双链表和单链表区别) 一、数组合并 1. 使用模拟指针和并两个有序数组 # 使用指针合并两个数组 arr1 = [1,3,4,6,7] arr2 = [2,5,8,9,10] #定义两个有序数组,并初始化赋值 ind = 0 # ans比较时...

    环形链表【手绘漫画】面试必考之双指针(LeetCode 141)

    环形链表进阶版【手绘漫画】面试必考之双指针(LeetCode 142) 上次讲了进阶版的,你会发现普通版本太easy了~ 还是来看题吧! 2、实例 LeetCode 142,一个求证链表中有没有环的题。 3、正文 一起来看一下: 两种...

    数据结构(Java版)(第2版)习题解答

    【习2.10】 实验2.6 带头结点的循环双链表类,实现线性表接口。 10 【习2.11】 实验2.5 建立按升序排序的循环双链表。 14 第3章 栈和队列 17 【习3.1】 习3-5 栈和队列有何异同? 17 【习3.2】 能否将栈声明为继承...

    leetcode题库-bigsai-algorithm:bigsai的数据结构与算法、LeetCode图解、剑指offer图解文章专栏,致力于

    链表 数学 哈希 双指针 滑动窗口 字符串 数组 二分 分治 字符串(中心扩散) 马拉车(待补充) 字符串 数学 数学 字符串 数学 dp 字符串 数组 双指针 数学 字符串 数学 字符串 字符串 数组 双指针 数组 双指针 字符串 ...

    Java数据结构和算法中文第二版(1)

    第5章 链表 链结点(Link) LinkList专题Applet 单链表 查找和删除指定链结点 双端链表 链表的效率 抽象数据类型 有序链表 双向链表 迭代器 小结 问题 实验 编程作业 第6章 递归 三角数字 阶乘 ...

    大数据面试题.pdf

    原⼦性、⼀致性、唯⼀性 1-3)java 的io类的图解 1-4)对象与引⽤对象的区别 对象就是好没有初始化的对象,引⽤对象即使对这个对象进⾏了初始化,这个初始化可以使⾃⼰的直接new的也可以是直接其他的赋值的, 那么...

Global site tag (gtag.js) - Google Analytics