如何得到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.如何使用迭代器
關于如何使用迭代器,我列舉出以下幾個非常重要的方法:
上面我用到了螞蟻的例子,那么我們假設這只工蟻得到超強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)!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot整合oracle_S
- 下一篇: python调用数据库判断_python