雙向鏈表

<pre name="code" class="java">public class DoubleList<T> {
	private Node<T> head = null;
	private Node<T> tail = null;
	private int length = 0;
		
	public static void main(String[] args) {
		DoubleList<Integer> dl = new DoubleList<Integer>();
		System.out.println("是否爲空:"+dl.isEmpty());
		dl.addToHead(2);
		dl.addToHead(5);
		dl.addToHead(9);
		dl.addToTail(10);
		System.out.print("鏈表爲:");
		dl.printList();
		dl.insertIndexAfter(2, 7);
		System.out.print("在第2個數後插入7後鏈表爲爲:");
		dl.printList();
		dl.insertIndexBefore(3, 13);
		System.out.print("在第3個數前插入13後鏈表爲爲:");
		dl.printList();
		dl.removeByKey(7);
		System.out.print("移除鍵值7後的鏈表爲:");
		dl.printList();
		dl.removeByIndex(3);
		System.out.print("移除第3個數後的鏈表爲:");
		dl.printList();
		dl.deleteFromHead();
		System.out.print("刪除頭部節點後的鏈表爲:");
		dl.printList();
		dl.deleteFromTail();
		System.out.print("刪除尾部節點後的鏈表爲:");
		dl.printList();
		dl.updateKeyByIndex(1, 3);
		System.out.print("將第1個數更新爲3後的鏈表爲:");
		dl.printList();
		System.out.println("第2個節點爲:"+dl.getKeyByIndex(2));
		System.out.println("是否爲空:"+dl.isEmpty());
		System.out.println("是否包含5:"+dl.isContains(5));
		System.out.println("鏈表長度爲:"+dl.getSize());
		System.out.println("頭結點爲:"+dl.getHeadKey());
		System.out.println("尾結點爲:"+dl.getTailKey());
		dl.clearList();
		System.out.print("清空後的鏈表爲:");
		dl.printList();
	}
	
	//構建一個空鏈表
	public DoubleList() {
		head = null;
		tail = null;
		length = 0;
	}
	
	//構建一個節點的鏈表
	public DoubleList(T data) {
		head  = new Node<T>(data);
		tail = head;
		length = 1;
	}
	
	//把一個節點插入到鏈表前面
	private void addToHead(T key) {
		if(head != null) {
			Node<T> nd = new Node<T>(key);
			nd.next = head;
			head.prev = nd;
			head = nd;
		} else {
			head = new Node<T>(key);
			tail = head;
		}
		length++;
	}
	
	//把一個節點插入到鏈表後面
	private void addToTail(T key) {
		if(tail != null) {
			Node<T> nd = new Node<T>(key);
			tail.next = nd;
			nd.prev = tail;
			tail = nd;
		} else {
			tail = new Node<T>(key);
			head = tail;
		}
		length++;
	}
	
	//在索引index前插入值
	private boolean insertIndexBefore(int index,T insertvalue) {
		if(index<1 || index>length) {
			System.err.println("索引越界");
			return false;
		}
		Node<T> insertNode = new Node<T>(insertvalue);
		Node<T> nd = head;
		int j=0;
		while(nd != null) {
			j++;
			if(j == index) {
				if(nd.prev == null) {
					addToHead(insertvalue);		
				} else {
					nd.prev.next = insertNode;
					insertNode.prev = nd.prev;
					insertNode.next = nd;
					nd.prev = insertNode;
					length++;
				}
				return true;
			}
			nd=nd.next;		
		}
		return false;
	}
	
	//在索引index後插入值
	private boolean insertIndexAfter(int index,T insertvalue) {
		if(index<1 || index>length) {
			System.err.println("索引越界");
			return false;
		}
		Node<T> insertNode = new Node<T>(insertvalue);
		Node<T> nd = head;
		int j=0;
		while(nd != null) {
			j++;
			if(j == index) {
				if(nd.next == null) {
					addToTail(insertvalue);
				} else {
					nd.next.prev = insertNode;
					insertNode.next = nd.next;
					nd.next = insertNode;
					insertNode.prev = nd;	
					length++;
				}
				return true;
			}
			nd=nd.next;
		}
		return false;
	}

	//移除第一個鍵值爲key的節點
	private boolean removeByKey(T key) {
		Node<T> nd = head;
		while(nd != null) {
			if(key == nd.key) {
				if(nd.prev == null){
					return deleteFromHead();
				}else if(nd.next == null) {
					return deleteFromTail();
				}else {
					nd.prev.next = nd.next;
					nd.next.prev = nd.prev;
					length--;
				}
				return true;
			}
			nd = nd.next;
		}
		return false;
	}
	
	//移除索引爲i的值
	private boolean removeByIndex(int index) {
		if(index<1 || index>length) {
			System.err.println("索引越界");
			return false;
		}
		Node<T> nd = head;
		int j=0;
		while(nd != null) {
			j++;
			if(j == index) {
				if(nd.prev == null){
					return deleteFromHead();
				}else if(nd.next == null) {
					return deleteFromTail();
				}else {
					nd.prev.next = nd.next;
					nd.next.prev = nd.prev;
					length--;
				}
				return true;
			}
			nd=nd.next;
		}	
		return false;
	}
	
	
	//刪除尾部節點
	private boolean deleteFromTail() {
		if(tail == null) {
			return false;
		}else {
			tail.prev.next = null;
			tail = tail.prev;
			length--;
			return true;
		}
	}

	//刪除頭部節點
	private boolean deleteFromHead() {
		if(head == null) {
			return false;
		}else {
			head.next.prev = null;
			head = head.next;
			length--;
			return true;
		}
	}

	private boolean updateKeyByIndex(int i,T key) {
		if(i<1 || i>length) {
			System.err.println("索引越界");
			return false;
		}
		Node<T> nd = head;
		for(int j=i-1;j>0;j--) {
			nd = nd.next;
		}
		nd.key = key;
		return true;
	}
	
	//獲得第i個鍵值
	private T getKeyByIndex(int i) {
		if(i<1 || i>length) {
			System.err.println("索引越界");
			return null;
		}
		Node<T> nd = head;
		for(int j=i-1;j>0;j--) {
			nd = nd.next;
		}
		return nd.key;
	}
	
	private boolean isEmpty() {
		return length == 0;
	}
	
	private boolean isContains(T key) {
		Node<T> nd = head;
		while(nd != null) {
			if(nd.key == key) {
				return true;
			}
			nd = nd.next;
		}
		return false;
	}
	
	private int getSize() {
		return length;
	}
	
	private T getHeadKey() {
		return head.key;
	}
	
	private T getTailKey() {
		return tail.key;
	}
		
	private void printList() {
		if(isEmpty()) {
			System.out.println("是空鏈表");
		} else {
			Node<T> temp = head;
			while(temp != null) {
				System.out.print(temp.key+" ");
				temp = temp.next;
			}
		}

		System.out.println();
	}
	
	private void clearList() {
		head = null;
		tail = null;
		length = 0;
	}

	private static class Node<T> {

		Node<T> prev = null;
		Node<T> next = null;
		T key = null;
		
		public Node(T key) {
			this.key = key;
		}
	}
}




運行結果爲:

是否爲空:true
鏈表爲:9 5 2 10 
在第2個數後插入7後鏈表爲爲:9 5 7 2 10 
在第3個數前插入13後鏈表爲爲:9 5 13 7 2 10 
移除鍵值7後的鏈表爲:9 5 13 2 10 
移除第3個數後的鏈表爲:9 5 2 10 
刪除頭部節點後的鏈表爲:5 2 10 
刪除尾部節點後的鏈表爲:5 2 
將第1個數更新爲3後的鏈表爲:3 2 
第2個節點爲:2
是否爲空:false
是否包含5:false
鏈表長度爲:2
頭結點爲:3
尾結點爲:2
清空後的鏈表爲:是空鏈表




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章