《資料結構與演算法》之連結串列—雙向連結串列
阿新 • • 發佈:2018-12-20
雙向連結串列也叫雙鏈表,是連結串列的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向連結串列中的任意一個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。
雙向連結串列構造程式碼如下:
public class DoubleLinkedList { private Node head; // 連結串列頭 private Node tail; // 連結串列尾 private int size; // 連結串列的節點個數 private class Node { private Object data; private Node next; private Node previous; public Node(Object data) { this.data = data; } } public DoubleLinkedList() { size = 0; head = null; tail = null; } // 在連結串列頭增加節點 public void addHead(Object value) { Node newNode = new Node(value); if (size == 0) { head = newNode; tail = newNode; size++; } else { head.previous = newNode; newNode.next = head; head = newNode; size++; } } // 在連結串列尾增加節點 public void addTail(Object value) { Node newNode = new Node(value); if (size == 0) { head = newNode; tail = newNode; size++; } else { newNode.previous = tail; tail.next = newNode; tail = newNode; size++; } } // 刪除連結串列頭 public Node deleteHead() { Node temp = head; if (size != 0) { head = head.next; head.previous = null; size--; } return temp; } // 刪除連結串列尾 public Node deleteTail() { Node temp = tail; if (size != 0) { tail = tail.previous; tail.next = null; size--; } return temp; } // 獲得連結串列的節點個數 public int getSize() { return size; } // 判斷連結串列是否為空 public boolean isEmpty() { return (size == 0); } // 從頭開始顯示節點資訊 public void headdisplay() { if (size > 0) { Node node = head; int tempSize = size; if (tempSize == 1) {// 當前連結串列只有一個節點 System.out.println("[" + node.data + "]"); return; } while (tempSize > 0) { if (node.equals(head)) { System.out.print("[" + node.data + "->"); } else if (node.next == null) { System.out.print(node.data + "]"); } else { System.out.print(node.data + "->"); } node = node.next; tempSize--; } System.out.println(); } else {// 如果連結串列一個節點都沒有,直接列印[] System.out.println("[]"); } } // 從尾開始顯示節點資訊 public void taildisplay() { if (size > 0) { Node node = tail; int tempSize = size; if (tempSize == 1) {// 當前連結串列只有一個節點 System.out.println("[" + node.data + "]"); return; } while (tempSize > 0) { if (node.equals(tail)) { System.out.print("[" + node.data + "->"); } else if (node.previous == null) { System.out.print(node.data + "]"); } else { System.out.print(node.data + "->"); } node = node.previous; tempSize--; } System.out.println(); } else {// 如果連結串列一個節點都沒有,直接列印[] System.out.println("[]"); } } }
測試程式:
public static void Test_DoubleLinkedList(){ DoubleLinkedList list=new DoubleLinkedList(); list.headdisplay(); list.addHead("123"); list.headdisplay(); list.addTail("456"); list.headdisplay(); list.taildisplay(); list.addHead("789"); list.headdisplay(); list.deleteTail(); list.headdisplay(); }