双向链表也叫双链表,与单向链表不同的是,每一个节点有三个区域组成:两个指针域,一个数据域
![数据结构-链表结构-双向链表,第1张 数据结构-链表结构-双向链表,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KV1HQu2K-1690882200220)(E:\Java笔记\数据结构\线形结构\链表结构\链表结构.assets\image-20230801092637927.png)],第1张](/upload/website_attach/202403/1_XVTAHY5QYB9SW9NQ.jpeg)
以下就是双向链表的最基本单位
![数据结构-链表结构-双向链表,第2张 数据结构-链表结构-双向链表,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K825DLOg-1690882200221)(E:\Java笔记\数据结构\线形结构\链表结构\链表结构.assets\image-20230801092801444.png)],第2张](/upload/website_attach/202403/1_XGQXPBBVSX46HTME.jpeg)
节点的前指针域指向前驱,后指针域执行后继
![数据结构-链表结构-双向链表,第3张 数据结构-链表结构-双向链表,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6zQK3LeB-1690882200221)(E:\Java笔记\数据结构\线形结构\链表结构\链表结构.assets\image-20230801112807368.png)],第3张](/upload/website_attach/202403/1_TXZQWZFF5ERMXMCJ.jpeg)
完整的双向链表
![数据结构-链表结构-双向链表,第4张 数据结构-链表结构-双向链表,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QC8iOcYu-1690882200222)(E:\Java笔记\数据结构\线形结构\链表结构\链表结构.assets\image-20230801140702244.png)],第4张](/upload/website_attach/202403/1_JUQTGP9RACCGDXQT.jpeg)
增
向双向链表的尾节点之后添加节点
尾节点的后指针域存储新添加节点的内存地址
新添加节点的前指针域存储尾节点的内存地址
注意:此时尾节点就是新添加的这个节点
![数据结构-链表结构-双向链表,第5张 数据结构-链表结构-双向链表,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tIwTitAd-1690882200223)(E:\Java笔记\数据结构\线形结构\链表结构\链表结构.assets230801_142639.gif)],第5张](/upload/website_attach/202403/1_WRGJQQTDXZWEHRF3.gif)
向双向链表的首元节点之前添加节点
新添加节点的后指针域存储首元节点的内存地址
首元节点的前指针域存储新添加节点的内存地址
注意:此时首元节点就是新添加的这个节点
![数据结构-链表结构-双向链表,第6张 数据结构-链表结构-双向链表,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yqVLrOWP-1690882200223)(E:\Java笔记\数据结构\线形结构\链表结构\链表结构.assets230801_153607.gif)],第6张](/upload/website_attach/202403/1_DSH6Q64S9WGXUMCE.gif)
删
删除中间节点时修改改节点的前驱和后继的指针方向即可
注意:被删除的节点称之为:野节点,这并不是真正意义上的删除,它在内存中依旧存在。那么野节点的最终归宿是被JVM的GC(垃圾回收器)所回收,也就是释放该节点的内存空间,这才是真正意义上的删除
额外知识:java中的垃圾回收器(Garbage Collector,GC)负责管理内存的分配和释放。当一个对象没有任何引用指向它时,它就变得不可达,而垃圾回收器会将其标记为垃圾对象,并在适当的时候回收该对象所占用的内存空间。这个过程称为垃圾回收。
![数据结构-链表结构-双向链表,第7张 数据结构-链表结构-双向链表,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kYeMLeLn-1690882200223)(E:\Java笔记\数据结构\线形结构\链表结构\链表结构.assets230801_160349 (1)].gif),第7张](/upload/website_attach/202403/1_HPAU7FH3SKFNTP6Z.gif)
改
查
双向链表在内存开销上相对于单向链表稍高。
由于有两个指针,插入和删除操作涉及到更多的指针修改,相对于单向链表略微复杂。
![数据结构-链表结构-双向链表,第8张 数据结构-链表结构-双向链表,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nqluhh2h-1690882200224)(E:\Java笔记\数据结构\线形结构\链表结构\链表结构.assets\image-20230801170615367.png)],第8张](/upload/website_attach/202403/1_A7Q3Q62G9QRQG4SK.jpeg)
单向链表相对于双向链表更简单且节省内存,适用于对内存占用敏感且只需要单向遍历的情况。
而双向链表由于具有双向遍历的能力,适用于需要频繁插入、删除和反向遍历的场景。
在选择使用哪种链表结构时,应根据具体需求权衡其优缺点。
public interface MyList{ //添加节点数据 void add(E element); //获取节点数据 E get (int index); //获取链表长度 int size(); //根据指针移除节点 E remove(int index); //从头添加元素 void addFirst(E element); //从尾添加元素 void addLast(E element); }
public class MyDoubleLinkedListimplements MyList { private int size;//记录元素的个数 private Node head