JAVA單向/雙向鏈表的實現


一、JAVA單向鏈表的操作(增加節點、查找節點、刪除節點)

class Link { // 鏈表類
	class Node { // 保存每一個節點,此處為了方便直接定義成內部類
		private String data; // 節點的內容
		private Node next; // 保存下一個節點

		public Node(String data) { // 通過構造方法設置節點內容
			this.data = data;
		}

		public void add(Node node) { // 增加節點
			if (this.next == null) { // 如果下一個節點為空,則把新節點加入到next的位置上
				this.next = node;
			} else { // 如果下一個節點不為空,則繼續找next
				this.next.add(node);
			}
		}

		public void print() { // 打印節點
			if (this.next != null) {
				System.out.print(this.data + "-->");
				this.next.print();
			} else {
				System.out.print(this.data + "\n");
			}
		}

		public boolean search(String data) { // 內部搜索節點的方法
			if (this.data.equals(data)) {
				return true;
			}
			if (this.next != null) {
				return this.next.search(data);
			} else {
				return false;
			}
		}

		public void delete(Node previous, String data) { // 內部刪除節點的方法
			if (this.data.equals(data)) {
				previous.next = this.next;
			} else {
				if (this.next != null) {
					this.next.delete(this, data);
				}
			}
		}
	}

	private Node root; // 定義頭節點

	public void addNode(String data) { // 根據內容添加節點
		Node newNode = new Node(data); // 要插入的節點
		if (this.root == null) { // 沒有頭節點,則要插入的節點為頭節點
			this.root = newNode;
		} else { // 如果有頭節點,則調用節點類的方法自動增加
			this.root.add(newNode);
		}
	}

	public void print() { // 展示列表的方法
		if (root != null) { // 當鏈表存在節點的時候進行展示
			this.root.print();
		}
	}

	public boolean searchNode(String data) { // 在鏈表中尋找指定內容的節點
		return root.search(data); // 調用內部搜索節點的方法
	}

	public void deleteNode(String data) { // 在鏈表中刪除指定內容的節點
		if (root.data.equals(data)) { // 如果是頭節點
			if (root.next != null) {
				root = root.next;
			} else {
				root = null;
			}
		} else {
			root.next.delete(this.root, data);
		}
	}
}

  測試:

public class TestMain {

	public static void main(String[] args) {
		Link l = new Link();
		l.addNode("A");
		
		l.addNode("B");
		l.addNode("C");
		l.addNode("D");
		System.out.println("原鏈表:");
		l.print();
		String searchNode = "B";
		System.out.println("查找節點:" + searchNode);
		String result = l.searchNode(searchNode)?"找到!":"沒找到!";
		System.out.println("查找結果:" + result);
		System.out.println("刪除節點:" + searchNode);
		l.deleteNode(searchNode);
		System.out.println("刪除節點后的鏈表:");
		l.print();

	}

}

  測試結果如下:

原鏈表:
A-->B-->C-->D
查找節點:B
查找結果:找到!
刪除節點:B
刪除節點后的鏈表:
A-->C-->D

原地址  

 二、雙向鏈表的簡單實現

public class DoubleLink<T> {

	/**
	 * Node<AnyType>類定義了雙向鏈表中節點的結構,它是一個私有類, 而其屬性和構造函數都是公有的,這樣,其父類可以直接訪問其屬性
	 * 而外部類根本不知道Node類的存在。
	 * 
	 * @author ZHB
	 *
	 * @param <T>
	 *            類型
	 * @param Data
	 *            是節點中的數據
	 * @param pre
	 *            指向前一個Node節點
	 * @param next
	 *            指向后一個Node節點
	 */
	private class Node<T> {
		public Node<T> pre;
		public Node<T> next;
		public T data;

		public Node(T data, Node<T> pre, Node<T> next) {
			this.data = data;
			this.pre = pre;
			this.next = next;
		}

		public Node() {
			this.data = null;
			this.pre = null;
			this.next = null;
		}
	}

	// 下面是DoubleLinkedList類的數據成員和方法
	private int theSize;
	private Node<T> Header;
	private Node<T> Tail;

	/*
	 * 構造函數 我們構造了一個帶有頭、尾節點的雙向鏈表 頭節點的Next指向尾節點 為節點的pre指向頭節點 鏈表長度起始為0。
	 */
	public DoubleLink() {

		theSize = 0;
		Header = new Node<T>(null, null, null);
		Tail = new Node<T>(null, Header, null);

		Header.next = Tail;
	}

	public void add(T item) {

		Node<T> aNode = new Node<T>(item, null, null);

		Tail.pre.next = aNode;
		aNode.pre = Tail.pre;
		aNode.next = Tail;
		Tail.pre = aNode;

		theSize++;
	}

	public boolean isEmpty() {
		return (this.theSize == 0);
	}

	public int size() {
		return this.theSize;
	}

	public T getInt(int index) {

		if (index > this.theSize - 1 || index < 0)
			throw new IndexOutOfBoundsException();

		Node<T> current = Header.next;

		for (int i = 0; i < index; i++) {
			current = current.next;
		}

		return current.data;
	}

	public void print() {

		Node<T> current = Header.next;

		while (current.next != null) {

			System.out.println(current.data.toString());

			current = current.next;
		}

	}

	public static void main(String[] args) {
		DoubleLink<String> dLink = new DoubleLink<String>();

		dLink.add("zhb");
		dLink.add("zzb");
		dLink.add("zmy");
		dLink.add("zzj");

		System.out.println("size : " + dLink.size());
		System.out.println("isEmpty? : " + dLink.isEmpty());
		System.out.println("3 : " + dLink.getInt(2));
		dLink.print();
	}
}

  原文地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM