如何得到iterator的当前元素_链表进化!双向链表+迭代器(Iterator)!
好的!今天来说
终极蛇皮之上帝视角之如何弄懂并实现双向链表!
还有如何正确定义和实用迭代器
(其实在打字的时候还是凌晨1:38,帮姑妈填表的我要累死了QAQ)
双向链表
上一篇文章我所介绍的链表其实只是一个很简单的链表,其中包含了以下几个功能:
- 在最前面/最后面新加入元素
- 得到第一个/最后一个元素
这个时候我们需要加入一些的好玩的东西:(因为上一篇文章根本没讲全呜呜我错了)
- length (表示这个链表的长度,有几个元素,长度就是多少)
- getLength() (得到链表的长度,具体和getFirst()差不多)
- removeLast() (删除最后一个元素)
- removeFirst (删除第一个元素)
- isEmpty() (如果这个链表的长度为0,那么这个方法返回true,如果不为0,返回false)
好的我们来讲讲如何实现removeLast和removeFirst
public void removeLast() throws NoSuchElementException{if(isEmpty()){throw new NoSuchElementException("removeLast(): "+"Cannot remove from an empty list");}else if(length==1){last=first=null;length--;return;}else {Node temp=first;while(temp.next!=last){temp=temp.next;}last=temp;last.next=null;}length--;return;}public void removeFirst() throws NoSuchElementException{if (first==null) {throw new NoSuchElementException("removeFirst(): Cannot remove "+ "from an empty List!");} if(length==1){first=last=null;length--;return;}first=first.next;first.prev=null;length--; return;}
以上是具体实现代码,两者还是有一定的区别的,在下图(视频?)中我会解释两者的不同
(插入视频/图文)
就算是加入了这些新的方法和properties,现在来看这个链表的功能和数组的功能比起来简直就是小巫见大巫,神似岳伦碰faker
但是
一 转 攻 势
我们可以在list的class里面添加自己想要的功能,谁不爱DIY呢?
好的废话少说,
双向链表,我们应该添加一些什么东西
第一个我们要在我们的节点private里面定义一个prev,这个prev包含了这个节点前一个节点的地址。这个时候双向链表就如下图所示
之前有听到过有人问如何把链表里面的所有元素都倒过来,提出这种问题的基础应该是在单向链表之上的,因为在双向链表里面正序倒序都一样(prev->prev->prev, next-> next->next)
好的这些差不多就是一个双向链表的大概介绍了
下面进入如何在双向链表的基础上创造出更多实用性的方法,以及介绍迭代器
迭代器
我觉得我在这篇文章里不能把所有的我认为的实用方法都介绍一遍,我还是挑选出那些更加必要的方法吧,便于大家理解少走弯路(太难的方法有时候真的很难懂)
好的什么是迭代器,假设我们有一条铁链分很多个小节(节点),每个小节上都有一个糖块(数据)大家可以把自己想像成蚁王/蚁后,你派遣一个工蚁去一条铁链(就是我们的链表)上的其中一个小节(特定的节点)拿一个糖块回来。
这个工蚁,起的就是迭代器的作用,我们如果想要拿到一条链表上面任意一个位置的数据,我们就必须要用到迭代器
1.如何创造一个迭代器
这个时候我们需要在这个list class里面定义一个private的iterator(迭代器英文,下面就不解释了)
2.如何使用迭代器
关于如何使用迭代器,我列举出以下几个非常重要的方法:
- getIterator()
- placeIterator()
- advanceIterator
- removeIterator
- reverseIterator
- addIterator
上面我用到了蚂蚁的例子,那么我们假设这只工蚁得到超强buff:摧毁所在位置的链条,焊接所在位置的链条,生产一个小节并加入到所在位置的节点后面
现在来做一个实验,我是蚁王,我想要做以下的集中措施:
- 派遣工蚁
- 指挥工蚁前进到我想要的糖块的小节上
- 拿到糖块
- 前进到另一个小节上,摧毁该小节+缝合链条
- 回到指定小节
- 添加一个小节,并放置糖块
好的我们知道工蚁就是我们的迭代器,那么派遣工蚁的方法我们就叫做placeIterator()
我们一般把迭代器首先放到链表的头部
public void placeIterator(){if(isEmpty()==true){throw new NoSuchElementException("Cannot place "+ "an iterator on a empty list!");}iterator=first;}
第二步,我们想要指挥工蚁去指定的节点,这个方法我们叫advanceIterator()、这个方法就是指挥工蚁渠道下一个节点,记住,只能挪一次
public void advanceIterator()throws NullPointerException{if(length==0){throw new NullPointerException("Cannot advance "+ "an iterator on a empty list.");}iterator=iterator.next;}
好了,有了以上的两个代码我认为我们可以自己创造以下的代码了(防止有人直接抄袭),我不介意分享,但是我认为单纯的抄袭真的没用,你不理解链表是如何运作就去抄代码根本就没用,不然我写这篇文章干啥
拿糖块叫getIterator() 这个方法会返回迭代器正在指向的节点的数据
好的,我们接下来要讲到一个重难点了
/*********删除链表中间的一个节点*********/
具体是如何删除的我还是想用图文解释,实在不懂,私聊
这样,我们想要删除的节点,和他前后的节点都没有联系了,我们再也不能通过这个链表得到我们想要删除的节点了,然后我们还必须保持链表的连续性,这就是我们想要达成的目标
/*********在链表里插入一个新的节点*********/
如果想要插入新的节点,继续图文!
记住,我们每次加入节点,都是在我们的迭代器的前面加入!
reverseIterator()这个方法和advance差不多,如果有不懂得私聊!我乐意帮忙!
那么这就是今天的全部内容啦!
明天见!
如何得到iterator的当前元素_链表进化!双向链表+迭代器(Iterator)!相关推荐
- iterator获取当前元素_java集合【5】——— Iterator接口
一.`iterator`接口介绍 二.为什么需要iterator接口 三.iterator接口相关接口 3.1 ListIterator 3.2 SpitIterator 四. iterator在集合 ...
- boost::unorder_map如何插入元素_链表和有序二叉树插入元素时真的比数组快吗?
脚本之家 你与百万开发者在一起 作者 | focuscode出品 | 脚本之家(ID:jb51net) 公司有位C++标准委员会的顾问大佬,一年会有几次视频讲座,分享一些编程要点或者经验.很多时候都是 ...
- STL源码剖析 迭代器iterator的概念 和 traits编程技法
iterator模式定义如下:提供一种方法,使之能够依序巡访某个 聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式. STL的中心思想在于:将数据容器(containers)和算法(a ...
- 什么是迭代器(Iterator)?
为了方便的处理集合中的元素,Java中出现了一个对象,该对象提供了一些方法专门处理集合中的元素.例如删除和获取集合中的元素.该对象就叫做迭代器(Iterator). 对 Collection 进行迭代 ...
- java递归单链表查找中间元素_《数据结构与算法——C语言描述》答案 3.11 查找单链表中的特定元素(递归)...
转载请注明出处:http://blog.csdn.net/xdz78 #include #include //查找单链表中的特定元素,<数据结构与算法--c语言描述> 3.11 答案 in ...
- JS数据结构与算法_链表
上一篇:JS数据结构与算法_栈&队列 下一篇:JS数据结构与算法_集合&字典 写在前面 说明:JS数据结构与算法 系列文章的代码和示例均可在此找到 上一篇博客发布以后,仅几天的时间竟然 ...
- stl clocklist 查找元素_剑指信奥 C++ 之 STL 迭代器(上)
趣乐博思剑指信奥 C++ 系列 ❝ 趣乐博思剑指信奥系列,专门针对全国青少年信息学奥林匹克联赛 NOIP 而开展的专业教育方案.开设的课程有 C 语言基础,C++ 语言基础,算法设计入门与进阶,经典试 ...
- c++迭代器iterator通用吗_「ES6基础」迭代器(iterator)
迭代器(iterator)是一个结构化的模式,用于从源以一次一个的方式提取数据.迭代器的使用可以极大地简化数据操作,于是ES6也向JS中添加了这个迭代器特性.新的数组方法和新的集合类型(如Set集合与 ...
- 如何得到iterator的当前元素_Java中迭代器Iterator详解
1.定义 Iterator的定义为:对Collection进行迭代的迭代器,Iterator取代了Java Collection Framework中的Enumeration.Iterator与Enu ...
最新文章
- No module named 'mxnet.gluon'
- php将soap返回的xml转成数组,PHP – 在PHP中将XML转换为数组 – 在php中解析soap xml并将其存储在数据库中...
- 画图怎么调整速度_初学者画图不流畅,线条毛躁生硬,而且手总抖怎么破?
- Linux内核套接字(Socket)的设计与实现
- 银行有没有必要建立数据中台?看看这些架构师和技术总监怎么说
- Oracle中用户和架构之间的区别?
- 让图片自适应屏幕大小
- 可视化实验三:大数据可视化工具—ECharts(一)
- 使用reg文件修改注册表
- win7 pptp服务器未响应,win7下vpn无法使用的解决办法
- C. Annoying Present(思维+数学)
- 'E:\AndroidSDK\platform-tools\adb.exe start-server' failed -- run manually if necessary
- 初学者如何3步入门选吉他,附上新手购琴常见问题和吉他品牌推荐
- 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest (大部分题解)
- 虚拟内存与物理内存的区别,
- 0240 计算机维修技术,0240.2016《计算机维修技术》西南大学网上作业题和答案.doc...
- 16.CSS中使用颜色
- java Appium之环境搭建
- linux 计价软件,开源实时计费系统 asterCC
- 想考个在职研究生学位,IT方向,学校越牛越好的