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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java实现单向链表

發布時間:2025/4/16 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java实现单向链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、單向鏈表的結構。(1)、首先節點的結構,其中包含本節點內容,以及需要指向下一個節點。 Java代碼 private static class Entry<E>{ E e; Entry<E> nextEntry; public Entry(E e,Entry<E> nextEntry){ this.e=e; this.nextEntry=nextEntry; } } private static class Entry<E>{E e;Entry<E> nextEntry;public Entry(E e,Entry<E> nextEntry){this.e=e;this.nextEntry=nextEntry;}}Java代碼 Java代碼 其中e則指向本節點的對象,而nextEntry則指向下一個節點。(2)、任何時候都需要知道表頭在哪里。畢竟是單向鏈表嘛,因為只有一個方向,找到了表頭就能找到全部。 Java代碼 private Entry<E> head; private Entry<E> head; (3)、還可以記錄鏈表中總共有多少個節點。它是在某些判斷時為了提高效率而存在的。不是絕對需要的。畢竟知道表頭后,一個一個按順序去尋找就好了。Java代碼 private int size; public int size(){ return this.size; } private int size;public int size(){return this.size;} Java代碼 好了有這三樣,就足夠了。就看我們如何用他們了。二、內部實現。(1)、第一次向鏈表中插入。此時鏈表中節點為null,第一次插入,無非就是把節點頭插入而已。 可以看出就是把鏈表頭初始化了,并且鏈表大小漲1。其中modCount記錄整個鏈表修改的次數,鏈表的增加和刪除它都會增加。畢竟第一次插入相對外調用是透明的,所以應該是私有的咯。(透明就是不可見,這里只得是外部沒必要知道它的存在)Java代碼 private void addFirst(E e){ head=new Entry<E>(e,null); size++; modCount++; } private void addFirst(E e){head=new Entry<E>(e,null);size++;modCount++;} (2)、表頭插入。在鏈表的頭前插入一個元素,新增的元素變成新的表頭。這個插入是效率最高的,畢竟你時刻知道鏈表的頭在哪里。Java代碼 public void addHead(E e){ if(head==null){ this.addFirst(e); }else{ Entry<E> newEntry=new Entry<E>(e,head); head=newEntry; size++; modCount++; } } public void addHead(E e){if(head==null){this.addFirst(e);}else{Entry<E> newEntry=new Entry<E>(e,head);head=newEntry;size++;modCount++;}}可以看出頭為null的時候,則表明鏈表中沒值,只需調用第一次插入。否則對給定的元素創新增一個節點,新增節點的下一個指向頭節點,當然此時自己已經變成頭結點了,索引要更新頭節點的引用。(可以看出想要清空鏈表,只需要將頭置為null就好了)(3)、指定節點插入(插隊)。在鏈表的指定節點插入一個元素,效率非常低。由于規則上你只能從隊伍第一個開始往后找,找到你要插隊位置的前一個,并將你插入其中,你先要告訴你身前人你在他身后,并且你自己要清楚你身后是誰。反正夠麻煩的。Java代碼 public void addSpecifyIndex(E e,int index){ if(index<0||index>size||size==0){ throw new NoSuchElementException(); } if(index==0){ this.addHead(e); return; } int count=0; for (Entry<E> p=head; p!=null;p=p.nextEntry) { if(count+1==index){ Entry<E> newEntry=new Entry<E>(e,p.nextEntry); p.nextEntry=newEntry; size++; modCount++; return; } count++; } } public void addSpecifyIndex(E e,int index){if(index<0||index>size||size==0){throw new NoSuchElementException();}if(index==0){this.addHead(e);return;}int count=0;for (Entry<E> p=head; p!=null;p=p.nextEntry) {if(count+1==index){Entry<E> newEntry=new Entry<E>(e,p.nextEntry);p.nextEntry=newEntry;size++;modCount++;return;}count++;}} Java代碼 先進行判斷index是否正確,規定不能插入null鏈表。而且不能跳著走,畢竟鏈表要連起來。由于要找到前一個,但是表頭的前一個是沒有的,所以index==0時要單獨判斷。后面則用count進行計數,找到其index-1節點,然后進行插隊處理。(4)、尾插入。其實也是插隊了,只是總是需要插到最后一個之后。Java代碼 public void add(E e){ if(head==null){ this.addFirst(e); }else{ this.addSpecifyIndex(e, size); } } public void add(E e){if(head==null){this.addFirst(e);}else{this.addSpecifyIndex(e, size);}} (5)、指定節點獲取元素。效率低,同樣從頭開始找到指定的節點把其中元素取出Java代碼 public E get(int index){ if(index<0||index>=size){ throw new NoSuchElementException(); } E result=null; int count=0; for (Entry<E> p=head;p!=null;p=p.nextEntry) { if(count==index){ result=p.e; } count++; } return result; } public E get(int index){if(index<0||index>=size){throw new NoSuchElementException();}E result=null;int count=0;for (Entry<E> p=head;p!=null;p=p.nextEntry) {if(count==index){result=p.e;}count++;}return result;} Java代碼 (6)、指定節點刪除。效率低,同樣需要找到指定節點前一節點,直接把指定節點跳過就好了。Java代碼 public void remove(int index){ if(index<0||index>=size){ throw new NoSuchElementException(); } if(index==0){ head=head.nextEntry; size--; modCount++; return; } int count=0; for (Entry<E> p=head;p.nextEntry!=null;p=p.nextEntry) { if(count+1==index){ p.nextEntry=p.nextEntry.nextEntry; size--; modCount++; break; } count++; } } public void remove(int index){if(index<0||index>=size){throw new NoSuchElementException();}if(index==0){head=head.nextEntry;size--;modCount++;return;}int count=0;for (Entry<E> p=head;p.nextEntry!=null;p=p.nextEntry) {if(count+1==index){p.nextEntry=p.nextEntry.nextEntry;size--;modCount++;break;}count++;}} (7)、循環。為了好進行遍歷演示,下面的就是循環遍歷所用的了,大家隨意看一下就好了。Java代碼 private transient Entry<E> current; public void setCursor(int index){ if(index<0||index>=size){ throw new NoSuchElementException(); } int count=0; for (Entry<E> p=head;p!=null;p=p.nextEntry) { if(count==index){ current=p; break; } count++; } } public boolean hasNext(){ return current!=null; } public E next(){ E result=current.e; current=current.nextEntry; return result; } private transient Entry<E> current;public void setCursor(int index){if(index<0||index>=size){throw new NoSuchElementException();}int count=0;for (Entry<E> p=head;p!=null;p=p.nextEntry) {if(count==index){current=p;break;}count++;}}public boolean hasNext(){return current!=null;}public E next(){E result=current.e;current=current.nextEntry;return result;} 三、測試。。一個main方法,測試一下。Java代碼 public static void main(String[] args) { SingleChain<String> singleChain=new SingleChain<String>(); for (int i = 0; i < 4; i++) { singleChain.add(i+""); } //頭插入 // singleChain.addHead("head"); //尾插入 // singleChain.add("tail"); //指定節點插入 // singleChain.addSpecifyIndex("Specify", 1); //指定節點刪除 // singleChain.remove(3); //設置循環的初始節點 singleChain.setCursor(0); int count=0; System.out.println("######SIZE"+singleChain.size()+"#######"); while(singleChain.hasNext()){ System.out.println("index:"+count+",entry:"+singleChain.next()); count++; } System.out.println(singleChain.get(singleChain.size()-1)); } public static void main(String[] args) {SingleChain<String> singleChain=new SingleChain<String>();for (int i = 0; i < 4; i++) {singleChain.add(i+"");}//頭插入 // singleChain.addHead("head");//尾插入 // singleChain.add("tail");//指定節點插入 // singleChain.addSpecifyIndex("Specify", 1);//指定節點刪除 // singleChain.remove(3);//設置循環的初始節點singleChain.setCursor(0);int count=0;System.out.println("######SIZE"+singleChain.size()+"#######");while(singleChain.hasNext()){System.out.println("index:"+count+",entry:"+singleChain.next());count++;}System.out.println(singleChain.get(singleChain.size()-1));} 四、全部代碼Java代碼 package paladin.chain; import java.util.NoSuchElementException; public class SingleChain<E> implements Chain<E>{ private Entry<E> head; private transient Entry<E> current; private int size; private int modCount; private void addFirst(E e){ head=new Entry<E>(e,null); size++; modCount++; } public void addHead(E e){ if(head==null){ this.addFirst(e); }else{ Entry<E> newEntry=new Entry<E>(e,head); head=newEntry; size++; modCount++; } } public void addSpecifyIndex(E e,int index){ if(index<0||index>size||size==0){ throw new NoSuchElementException(); } if(index==0){ this.addHead(e); return; } int count=0; for (Entry<E> p=head; p!=null;p=p.nextEntry) { if(count+1==index){ Entry<E> newEntry=new Entry<E>(e,p.nextEntry); p.nextEntry=newEntry; size++; modCount++; return; } count++; } } public void add(E e){ if(head==null){ this.addFirst(e); }else{ this.addSpecifyIndex(e, size); } } public E get(int index){ if(index<0||index>=size){ throw new NoSuchElementException(); } E result=null; int count=0; for (Entry<E> p=head;p!=null;p=p.nextEntry) { if(count==index){ result=p.e; } count++; } return result; } public void remove(int index){ if(index<0||index>=size){ throw new NoSuchElementException(); } if(index==0){ head=head.nextEntry; size--; modCount++; return; } int count=0; for (Entry<E> p=head;p.nextEntry!=null;p=p.nextEntry) { if(count+1==index){ p.nextEntry=p.nextEntry.nextEntry; size--; modCount++; break; } count++; } } public void setCursor(int index){ if(index<0||index>=size){ throw new NoSuchElementException(); } int count=0; for (Entry<E> p=head;p!=null;p=p.nextEntry) { if(count==index){ current=p; break; } count++; } } public boolean hasNext(){ return current!=null; } public E next(){ E result=current.e; current=current.nextEntry; return result; } public int size(){ return this.size; } public static void main(String[] args) { SingleChain<String> singleChain=new SingleChain<String>(); for (int i = 0; i < 4; i++) { singleChain.add(i+""); } //頭插入 // singleChain.addHead("head"); //尾插入 // singleChain.add("tail"); //指定節點插入 // singleChain.addSpecifyIndex("Specify", 1); //指定節點刪除 // singleChain.remove(3); //設置循環的初始節點 singleChain.setCursor(0); int count=0; System.out.println("######SIZE"+singleChain.size()+"#######"); while(singleChain.hasNext()){ System.out.println("index:"+count+",entry:"+singleChain.next()); count++; } System.out.println(singleChain.get(singleChain.size()-1)); } private static class Entry<E>{ E e; Entry<E> nextEntry; public Entry(E e,Entry<E> nextEntry){ this.e=e; this.nextEntry=nextEntry; } } }

總結

以上是生活随笔為你收集整理的java实现单向链表的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 成年人av在线 | www日韩| 国产成人综合在线观看 | 黑人100部av解禁片 | 夏目彩春娇喘呻吟高潮迭起 | 这里只有精品免费视频 | 色5566| av日韩一区二区三区 | 国产91影院| 亚洲日本一区二区三区 | 涩涩网址 | 成年丰满熟妇午夜免费视频 | 一区二区的视频 | 蜜桃av乱码一区二区三区 | 激情一区 | 羞羞动漫在线观看 | 三级理伦 | 综合久久五月天 | 久久偷拍免费视频 | а√天堂8资源在线官网 | 午夜精品久久久久久久无码 | 风间由美一区二区三区 | 亚洲阿v天堂 | 天天干夜夜 | 成人影片在线播放 | 黑丝av在线 | 可以免费观看的av网站 | 91久久超碰 | 精品国产大片大片大片 | 四级黄色片 | 久久精品久久精品久久精品 | 乱日视频 | 国产熟妇一区二区三区四区 | 一本久道综合色婷婷五月 | 免费观看av的网站 | 欧美三级成人 | 日本黄色xxxxx | 麻豆亚洲一区 | av老司机在线观看 | 亚洲免费大片 | 午夜色图 | 欧美日韩在线观看一区二区三区 | 国产自产21区| 日批在线观看视频 | 黄色网日本 | 人妻一区二区三 | 性xxxx搡xxxxx搡欧美 | 中文字幕亚洲第一 | 国产成人免费 | 国产精品100 | 综合国产一区 | 欧美久久网 | 精品视频免费播放 | xxx麻豆 | 15—16女人毛片 | 先锋资源av在线 | 亚洲女人被黑人巨大进入 | 天堂影院一区二区 | 风韵少妇spa私密视频 | 国产无遮挡一区二区三区毛片日本 | 免费高清视频一区二区三区 | 久精品在线观看 | 日韩中文字幕免费视频 | 日韩性大片 | 日本午夜视频 | 欧美日韩国产一区二区 | 校园激情av | 激情在线视频 | 日韩片在线 | 一区二区三区国产 | 国产鲁鲁视频在线观看免费 | 黄页网站视频在线观看 | 欧美在线一区二区 | 精品日本一区二区三区在线观看 | 真人毛片97级无遮挡精品 | 陪读偷伦初尝小说 | 日韩精品免费在线观看 | 日本午夜视频在线观看 | 黄色片91 | 国内精品视频一区二区三区 | 久久久久性色av无码一区二区 | 午夜免费视频观看 | 丹丹的呻吟声1一7 | 176精品免费| 国产青草视频在线观看 | 午夜免费毛片 | 激情小说图片视频 | 中文字幕乱码亚洲精品一区 | 国产一区网站 | xiuxiuavnet | 亚洲专区欧美 | 91精品国产综合久久福利软件 | 国产精品黑人一区二区三区 | 涩涩小网站 | 午夜视频在线观看网站 | 免费操人视频 | 已满18岁免费观看电视连续剧 | 动漫羞羞 | 久久精品欧美日韩 |