欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

如何得到iterator的当前元素_链表进化!双向链表+迭代器(Iterator)!

发布时间:2025/6/17 编程问答 25 豆豆
生活随笔 收集整理的这篇文章主要介绍了 如何得到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)!的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。