原文:https://blog.csdn.net/nzfxx/article/details/51728516
"双向链表"-数据结构算法-之通俗易懂,完全解析
1.概念的引入
相信大家都使用过各种集合来进行开发,但是较少的人会去研究其内部的存储原理和调用方法,今天我就来带大家一起学习数据结构算法:双向链表
首先我们先来了解什么是缓存,以及数据在内存中的存储方式.
1.缓存是什么
如果cup读取数据时,每次读取都是从内存再到硬盘读取,那么效率就太低了. 所以可以预先把数据存到内存,然后cup下次从内存读取即可.
2.数据在内存中的存储方式
第1种.线性
所谓线性,就是内存是连续的,举例ArrayList或者数组: 我们知道,数组存储数据的时候,当你申请100个大小,但是内存不足的时候就会导致内存不足而失败,或者即使你请求到了100个,但是你只存3个数据,那么就浪费内存了 =>优点:查找数据快(好比几个好朋友乘火车,车票都连在一起就好找了) 缺点:1,内存不足就失败;2.浪费内存(买了10张火车票,但是只有3个人乘车,那么就浪费了7张)
第2种.链接
内存是链接的(用于解决内存不足,解决线性(上面)问题的不足),比如不连续的空间也能存数据,比如买火车票,有火车票就卖给你,要几张卖几张,不连续位置的也卖. =>优点:解决内存不足,解决内存浪费 缺点:找人比较慢(票不连续,不一定在一个车厢)
节点的属性:
多个节点的内部构造:
代码思路
一.添加节点add(Object obj)
1.Node节点属性: prev:存放前节点(相当于地址,地址就是指针,指针就是地址) data:Object各种数据 next:存放下节点 2.定义head,rear节点,当只有一个节点,那么head和rear同指一个节点 3.节点添加的方法add(Object obj) 1.创建节点new Node(),即每加一个数据就创一个节点 2.放数据 3.把节点放入链表中 1.如果头结点为空,那么头结点和尾节点都指向该节点 2.如果头节点不为空 1.往尾部添加 原来的next指向新节点 rear.next = note; 新节点pre指向原节点,新节点也变成尾节点 note.pre = rear (ps,有需求再设置往头部添加) 4.toString方法[元素1,元素2,元素3] while(head!=null) if(head!=rear)append(head.data+","),***同temp代替head,否则会破坏head,影响后面的remove时head变才null了