您好,登錄后才能下訂單哦!
本篇內容介紹了“Java如何實現雙向鏈表”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
1.1 雙向鏈表的每個節點組成包含節點數據,上一個節點(pre),下一個節點(next)
1.2 雙向鏈表節點結構
class Node { //節點數據data int data; Node pre; Node next; public Node(int data) { this.data = data; } public Node() { super(); } }
2.1 雙向鏈表的增刪改查
public class DoubleLinkedList { private Node first; private Node current; private static class Node { int data; Node pre; Node next; public Node(int data) { super(); this.data = data; } public Node() { super(); } } public DoubleLinkedList() { super(); } /** * 雙向鏈表增加 */ public void add(int val) { // 如果是頭結點 if (first == null) { Node node = new Node(val); first = node; first.pre = null; first.next = null; current = first; } else { Node node = new Node(val); current.next = node; node.pre = current; current = node; } } /** * 雙向鏈表的刪除 刪除所有值為val的元素 */ public void del(int val) { if (first == null) { System.out.println("雙向鏈表為空,無法進行刪除操作!"); } else { Node node = first; while(true) { // 首節點的刪除可能 if (node.data == val) { //如果只有一個節點 if(node.next==null) { node=null; first=null; System.out.println("刪除所有的"+val+"成功"); return; }else { node = node.next; node.pre.next=null; node.pre=null; first=node; //刪除后重新循環判斷首節點是否值相等 continue; } } else { while (node.next != null) { if (node.data == val) { node.pre.next = node.next; node.next.pre = node.pre; Node tempNode = node.pre; node.pre=null; node.next=null; node = tempNode; } node = node.next; } // 末節點刪除可能 if (node.data == val) { node.pre.next=null; node.pre=null; } System.out.println("刪除所有的"+val+"成功"); //末節點判斷完成后,結束循環 return; } } } } /** * 遍歷雙向鏈表操作 */ public void traverse() { if(first==null) { System.out.println("雙向鏈表為空"); }else { Node node = first; //循環遍歷到倒數第二個節點截止 while(node.next!=null) { System.out.print(node.data+" "); node=node.next; } //遍歷最后一個節點 System.out.print(node.data); } } /** * 雙向鏈表插入操作,在所有值為value的后面插入一個數insert */ public void insert(int value,int insert) { if(first==null) { System.out.println("雙向鏈表為空,無法插入"); }else { Node node = first; //循環遍歷到倒數第二個節點截止 while(node.next!=null) { if(node.data==value) { Node insertNode = new Node(insert); node.next.pre = insertNode; insertNode.next = node.next; node.next = insertNode; insertNode.pre = node; } node=node.next; } //最后一個節點后插入 if(node.data == value) { Node insertNode = new Node(insert); node.next = insertNode; insertNode.pre = node; } System.out.println(); System.out.println("插入操作完成"); } } /** * 雙向鏈表修改數據,將所有值為val的修改為revised */ public void revise(int val,int revised) { if(first==null) { System.out.println("雙向鏈表為空,無法修改"); }else { Node node = first; while (node.next!=null) { if(node.data == val) { node.data = revised; } node=node.next; } if(node.data == val) {} node.data = revised; } System.out.println("修改操作完成"); } /** * 查找雙向鏈表中是否包含val值 * @param val */ public void contain(int val) { if(first==null) { System.out.println("鏈表為空,無法查找"); }else { Node node = first; while(node!=null) { if(node.data==val) { System.out.println("該鏈表中包含"+val+"的值"); return; }else { node=node.next; } } System.out.println("該鏈表不包含"+val); } } }
2.2 測試類(main入口函數)
public class Main { public static void main(String[] args) { DoubleLinkedList list = new DoubleLinkedList(); list.add(1); list.add(1); list.add(2); list.insert(1, 3); list.add(2); list.add(3); list.traverse(); System.out.println(); list.del(1); list.traverse(); list.add(4); System.out.println(); list.traverse(); System.out.println(); list.contain(4); list.contain(3); list.contain(0); } }
1)、循環結束是到倒數第二個節點截止的,要考慮多種不同的情況,頭節點刪除,尾結點刪除等,導致刪除函數復雜了很多
2)、在contain函數中有修改到循環到最后一個節點
3)、后續對刪除函數修改有空再操作(待完成)
“Java如何實現雙向鏈表”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。