好的!今天来说

终极蛇皮之上帝视角之如何弄懂并实现双向链表!

还有如何正确定义和实用迭代器

(其实在打字的时候还是凌晨1:38,帮姑妈填表的我要累死了QAQ)

双向链表

上一篇文章我所介绍的链表其实只是一个很简单的链表,其中包含了以下几个功能:

  1. 在最前面/最后面新加入元素
  2. 得到第一个/最后一个元素

这个时候我们需要加入一些的好玩的东西:(因为上一篇文章根本没讲全呜呜我错了)

  • 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.如何使用迭代器

关于如何使用迭代器,我列举出以下几个非常重要的方法:

  1. getIterator()
  2. placeIterator()
  3. advanceIterator
  4. removeIterator
  5. reverseIterator
  6. addIterator

上面我用到了蚂蚁的例子,那么我们假设这只工蚁得到超强buff:摧毁所在位置的链条,焊接所在位置的链条,生产一个小节并加入到所在位置的节点后面

现在来做一个实验,我是蚁王,我想要做以下的集中措施:

  1. 派遣工蚁
  2. 指挥工蚁前进到我想要的糖块的小节上
  3. 拿到糖块
  4. 前进到另一个小节上,摧毁该小节+缝合链条
  5. 回到指定小节
  6. 添加一个小节,并放置糖块

好的我们知道工蚁就是我们的迭代器,那么派遣工蚁的方法我们就叫做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)!相关推荐

  1. iterator获取当前元素_java集合【5】——— Iterator接口

    一.`iterator`接口介绍 二.为什么需要iterator接口 三.iterator接口相关接口 3.1 ListIterator 3.2 SpitIterator 四. iterator在集合 ...

  2. boost::unorder_map如何插入元素_链表和有序二叉树插入元素时真的比数组快吗?

    脚本之家 你与百万开发者在一起 作者 | focuscode出品 | 脚本之家(ID:jb51net) 公司有位C++标准委员会的顾问大佬,一年会有几次视频讲座,分享一些编程要点或者经验.很多时候都是 ...

  3. STL源码剖析 迭代器iterator的概念 和 traits编程技法

    iterator模式定义如下:提供一种方法,使之能够依序巡访某个 聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式. STL的中心思想在于:将数据容器(containers)和算法(a ...

  4. 什么是迭代器(Iterator)?

    为了方便的处理集合中的元素,Java中出现了一个对象,该对象提供了一些方法专门处理集合中的元素.例如删除和获取集合中的元素.该对象就叫做迭代器(Iterator). 对 Collection 进行迭代 ...

  5. java递归单链表查找中间元素_《数据结构与算法——C语言描述》答案 3.11 查找单链表中的特定元素(递归)...

    转载请注明出处:http://blog.csdn.net/xdz78 #include #include //查找单链表中的特定元素,<数据结构与算法--c语言描述> 3.11 答案 in ...

  6. JS数据结构与算法_链表

    上一篇:JS数据结构与算法_栈&队列 下一篇:JS数据结构与算法_集合&字典 写在前面 说明:JS数据结构与算法 系列文章的代码和示例均可在此找到 上一篇博客发布以后,仅几天的时间竟然 ...

  7. stl clocklist 查找元素_剑指信奥 C++ 之 STL 迭代器(上)

    趣乐博思剑指信奥 C++ 系列 ❝ 趣乐博思剑指信奥系列,专门针对全国青少年信息学奥林匹克联赛 NOIP 而开展的专业教育方案.开设的课程有 C 语言基础,C++ 语言基础,算法设计入门与进阶,经典试 ...

  8. c++迭代器iterator通用吗_「ES6基础」迭代器(iterator)

    迭代器(iterator)是一个结构化的模式,用于从源以一次一个的方式提取数据.迭代器的使用可以极大地简化数据操作,于是ES6也向JS中添加了这个迭代器特性.新的数组方法和新的集合类型(如Set集合与 ...

  9. 如何得到iterator的当前元素_Java中迭代器Iterator详解

    1.定义 Iterator的定义为:对Collection进行迭代的迭代器,Iterator取代了Java Collection Framework中的Enumeration.Iterator与Enu ...

最新文章

  1. No module named 'mxnet.gluon'
  2. php将soap返回的xml转成数组,PHP – 在PHP中将XML转换为数组 – 在php中解析soap xml并将其存储在数据库中...
  3. 画图怎么调整速度_初学者画图不流畅,线条毛躁生硬,而且手总抖怎么破?
  4. Linux内核套接字(Socket)的设计与实现
  5. 银行有没有必要建立数据中台?看看这些架构师和技术总监怎么说
  6. Oracle中用户和架构之间的区别?
  7. 让图片自适应屏幕大小
  8. 可视化实验三:大数据可视化工具—ECharts(一)
  9. 使用reg文件修改注册表
  10. win7 pptp服务器未响应,win7下vpn无法使用的解决办法
  11. C. Annoying Present(思维+数学)
  12. 'E:\AndroidSDK\platform-tools\adb.exe start-server' failed -- run manually if necessary
  13. 初学者如何3步入门选吉他,附上新手购琴常见问题和吉他品牌推荐
  14. 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest (大部分题解)
  15. 虚拟内存与物理内存的区别,
  16. 0240 计算机维修技术,0240.2016《计算机维修技术》西南大学网上作业题和答案.doc...
  17. 16.CSS中使用颜色
  18. java Appium之环境搭建
  19. linux 计价软件,开源实时计费系统 asterCC
  20. 想考个在职研究生学位,IT方向,学校越牛越好的

热门文章

  1. Windows 10 安装
  2. jQuery插件开发方式
  3. 【翻译】为什么 goroutine 的栈内存无穷大?
  4. 模块全解======ruby的类是单继承生物、所以出现了module、实现了多继承
  5. albian开发笔记五--谈缓存同步
  6. Puppet集中配置管理系统[安装与配置]
  7. legend3---laravel验证码使用
  8. MongoDB -- Error: unclean shutdown detected
  9. xml转json和实体类的两种方式
  10. 在VS2015中编写x86汇编