Java實現雙向鏈表
本文實例為大傢分享瞭Java實現雙向鏈表的具體代碼,供大傢參考,具體內容如下
1、雙向鏈表
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、雙向鏈表的增刪改查(crud)
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); } }
3、一些缺點待修改
1)、循環結束是到倒數第二個節點截止的,要考慮多種不同的情況,頭節點刪除,尾結點刪除等,導致刪除函數復雜瞭很多
2)、在contain函數中有修改到循環到最後一個節點
3)、後續對刪除函數修改有空再操作(待完成)
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。