日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

發布時間:2025/6/17 编程问答 76 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何得到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)!的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。