快速入门无头双链表
文章目錄
- 無頭雙向單鏈表的基礎功能實現
- 頭插法
- 尾插法
- 刪除第一次出現關鍵字為key的節點
- 刪除所有的值為key的節點
- 任意位置插入
- 清空雙鏈表
無頭雙向單鏈表的基礎功能實現
在單鏈表的學習中,我們已經掌握了求單鏈表的長度,是否包含了某一個元素,以及打印單鏈表,無頭雙鏈表的求長度,判斷是否包含了某一個元素,打印雙鏈表,都是與單鏈表的寫法一樣的,所以這里就不在多做贅述。
頭插法
變化前
變化后
代碼實現:
尾插法
變化前
變化后
代碼實現:
刪除第一次出現關鍵字為key的節點
一般情況
出現在頭部情況(假設要刪除的第一次數據在頭部出現):
出現在尾部(假設要刪除的數據最后才第一次出現):
對以上情況進行分析之后,我們必須通過遍歷來解決,具體實現代碼如下:
但是在這里代碼是有缺陷的,因為如果就是一個節點的時候,那么此時代碼會報錯,我們就需要單獨討論一下,具體代碼實現如下:
public void remove(int key){if (head==null)return;listnode cur=head;while (cur!=null){if (cur.val==key){if (cur==head){head=head.next;if (head!=null){head.prve=null;}else{last=null;//尾節點要變成null,不然會被一直引用}}else{cur.prve.next=cur.next;if (cur==last){last=cur.prve;}else{cur.next.prve=cur.prve;}}}else{cur=cur.next;}}}刪除所有的值為key的節點
這個就需要在刪第一次為key的基礎上,把return去掉,然后要讓cur一直往下走,具體實現代碼如下:
//刪除所有值為key的節點public void removeAllKey(int key){if (head==null)return;listnode cur=head;while (cur!=null){if (cur.val==key){if (cur==head){head=head.next;if (head!=null){head.prve=null;}else{last=null;}}else{cur.prve.next=cur.next;if (cur.next!=null){cur.next.prve=cur.prve;}else{last=last.prve;}}}cur=cur.next;}}任意位置插入
插入前:
插入后
代碼實現如下:
//任意位置插入,第一個數據節點為0號下標public listnode search(int index){if (index<0||head==null)return null;listnode cur=head;while (index!=0){cur=cur.next;if (cur==null){//說明超出鏈表的長度return null;}index--;}return cur;}public void addIndex(int index,int data){listnode listnode=new listnode(data);if (index==0){//如果是第一個位置就是頭插法addFirst(data);return;}if (index==size()){//最后一個位置就是尾插法addLast(data);return;}listnode ret=search(index);if (ret==null)return;ret.prve.next=listnode;listnode.next=ret;listnode.prve=ret.prve;ret.prve=listnode;}清空雙鏈表
代碼實現:
雙鏈表基本功能實現源碼
單鏈表的功能實現
總結
- 上一篇: java中类与对象回顾总结
- 下一篇: java面向对象——包+继承+多态(一)