1. 程式人生 > >有序連結串列的基本用法

有序連結串列的基本用法

有序連結串列:連結串列本身是一種無序的資料結構,元素的插入和刪除不能保證順序性,但是有沒有有序的連結串列呢?答案是肯定的,我們在單鏈表中插入元素時,只需要將插入的元素與頭結點及其後面的結點比較,從而找到合適的位置插入即可。一般在大多數需要使用有序陣列的場合也可以使用有序連結串列,有序連結串列在插入時因為不需要移動元素,因此插入速度比陣列快很多,另外連結串列可以擴充套件到全部有效的使用記憶體,而陣列只能侷限於一個固定的大小中。

        有序連結串列的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-->

我的座右銘:不會,我可以學;落後,我可以追趕;跌倒,我可以站起來;我一定行。