以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语言实现,文章及代码资源均已上传,可在专栏《数据...
双向链表是一种基础的数据结构,尤其在理解和实现算法时至关重要。相比于单链表,双向链表的特点在于每个节点不仅包含指向下一个节点的指针,还包含一个指向前一个节点的指针,这使得在链表中的移动更加灵活,可以从...
剑指 Offer 36. 二叉搜索树与双向链表题解写的比我的简单面试题36. 二叉搜索树与双向链表(中序遍历,清晰图解)
本章分为四个主要部分:线性表的定义和存储、顺序表的操作、单链表的结点结构和操作、双链表的结点结构和操作。 第一部分:线性表的定义和存储 线性表是一种基本的数据结构,它是一种顺序存储的数据结构。线性表的...
【小林的图解系列之一,图解Redis数据结构】 Redis是一种高性能的内存数据库,其速度之快得益于其数据结构的高效实现。Redis中的数据结构并非仅限于基础的String、List、Hash、Set和Zset等数据类型,而是指它们在...
《图解数据结构》是一本深受程序员喜爱的书籍,它以直观易懂的方式介绍了各种重要的数据结构及其在C++中的实现。源码是学习和理解数据结构的关键辅助工具,能够帮助读者更深入地掌握每种数据结构的工作原理。在这个...
内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、...
链表分为单链表、双链表和循环链表等,每种都有其特定的应用场景。 3. **栈**:后进先出(LIFO)的数据结构,常用的操作是压入(push)、弹出(pop)和查看顶部元素。C++标准库提供了`std::stack`容器模板类来实现...
这一章可能会讲解单链表、双链表、循环链表的创建、插入、删除和遍历等操作。 3. **第三章:栈和队列** 栈是一种“后进先出”(LIFO)的数据结构,常用于函数调用、表达式求值等场景;队列则是“先进先出”(FIFO...
链表分为单链表、双链表和循环链表等,插入和删除操作相对数组更灵活。 3. **栈**:栈是一种后进先出(LIFO)的数据结构,常用于函数调用、表达式求值等场景。常见的操作有push(入栈)、pop(出栈)和peek(查看...
补充知识:其实链表分为单链表和双链表(此图出处)。 说出来你可能不信对于链表的介绍就像开玩笑一样的结束了。。。。。。 但是为了加强下印象简单实现个单链表结构,大佬勿喷。。。 class Node(object): def __...
牛顿法图解方程 8.屏保程序 9.运动图像程序 10.特殊图像程序 11.窗口菜单显示 12.日期处理 13.日期时间计算 14.工资管理 15.财务管理 16.域名服务器 17.电话簿管理 18.商品库存管理 19.股票交易 20.矩阵旋转反射 21....
### 图解 Java 中的数据结构及原理 #### 一、引言 在 Java 开发中,数据结构的选择至关重要,它直接影响到程序的效率和性能。本文将深入探讨 Java 中几种常用的数据结构及其工作原理,包括 `LinkedList`、`...
理解它们的特点和使用场景,如ArrayList的动态扩容、LinkedList的链表操作效率、HashSet的无序唯一性以及HashMap的键值对存储,能提升你在实际开发中的效率。 多线程是Java的一个强项,它支持并发执行任务,提高了...
2. **链表(Linked List)**:包括单链表、双链表等,每个节点包含数据和指向下一个节点的引用。在Python中,可以使用类来实现链表结构。 3. **栈(Stack)**:遵循后进先出(LIFO)原则,常用操作是压栈(push)和...
《图解数据结构使用C++范例程序》是学习数据结构与算法的宝贵资源,它通过C++语言提供了丰富的实例代码,帮助读者深入理解各种数据结构的实现与应用。这个压缩包包含了书中多个章节的代码示例,方便读者边学边练,...
### LeetCode 206题:反转链表 #### 知识点一:链表基本概念 - **定义**:链表是一种常见的线性数据结构,由一系列节点组成,每个节点包含一个数据元素以及指向下一个节点的引用。 - **类型**:链表分为单向链表、...