有序連結串列的基本用法
阿新 • • 發佈:2019-01-05
有序連結串列:連結串列本身是一種無序的資料結構,元素的插入和刪除不能保證順序性,但是有沒有有序的連結串列呢?答案是肯定的,我們在單鏈表中插入元素時,只需要將插入的元素與頭結點及其後面的結點比較,從而找到合適的位置插入即可。一般在大多數需要使用有序陣列的場合也可以使用有序連結串列,有序連結串列在插入時因為不需要移動元素,因此插入速度比陣列快很多,另外連結串列可以擴充套件到全部有效的使用記憶體,而陣列只能侷限於一個固定的大小中。
有序連結串列的Java程式碼實現:
package parking; import java.util.Random; class Node { Integer data; Node next; public Node(Integer data) { this.data = data; } } public class LinkOrder { private Node head; private int size; public LinkOrder() { this.head = null; this.size = 0; } // 判斷是否為空 private boolean isEmpty() { return head == null ? true : false; } // 獲取連結串列大小 private int getSize() { return size; } // 在連結串列中插入一個結點,保持連結串列有序性(頭結點最小,尾結點最大) public void insert(int key) { Node newLink = new Node(key); Node previous = null; Node current = head; while (current != null && key > current.data) { // 找下個節點 previous = current; current = current.next; } // 比當前節點值小,剛好插入當前節點前面 if (previous == null) {// 連結串列是空的 head = newLink; } else { previous.next = newLink; } newLink.next = current; size++; } // 返回頭結點 private Integer headNode() { if (head == null) { return null; } Integer value = head.data; return value; } // 刪除頭結點,並刪除 private Integer deleteHnode() { if (head == null) { return null; } Integer value = head.data; if (head.next == null) { head = null; } else { head = head.next; } size--; return value; } // 刪除指定結點 private void deleteNode(Node node) { if (head == null) { System.out.println("連結串列為空"); return; } Node current = head; Node pre = null; while (current.data != node.data) { if (current.next == null) { System.out.println("沒有找到該結點"); return; } pre = current; current = current.next; } if (current == head) { deleteHnode(); } else { pre.next = current.next; size--; } } // 遍歷有序連結串列 private void sysNode() { if (head == null) { System.out.println("該連結串列為空"); } Node current = head; while (current != null) { System.out.print(current.data + "-->"); current = current.next; } System.out.println(); } public static void main(String[] args) { // TODO Auto-generated method stub LinkOrder order = new LinkOrder(); int i; Node node; for (i = 0; i < 5; i++) { order.insert(new Random().nextInt(100)); } System.out.println("有序連結串列大小:" + order.getSize()); order.sysNode(); System.out.println("有序連結串列頭結點:" + order.deleteHnode()); order.sysNode(); node = new Node(new Random().nextInt(100)); System.out.println("刪除指定結點:" + node.data); order.deleteNode(node); order.sysNode(); } }
效果:
有序連結串列大小:5
44-->44-->59-->70-->71-->
有序連結串列頭結點:44
44-->59-->70-->71-->
刪除指定結點:59
44-->70-->71-->