1. 程式人生 > >Java單鏈表的簡單操作

Java單鏈表的簡單操作

連結串列:連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。(百度百科解釋)

1.定義一個節點類

	//定義連結串列節點類
	private class Node{
		
		private Object data; //定義節點資料
		private Node next;  //定義指向的下一個節點
		public Node(Object data){
			this.data = data;
		}
	}

2.連結串列的基本操作

public class SingleLinkedList {

	private int size;//定義連結串列節點的個數
	
	private Node head;//頭結點
	
	public SingleLinkedList() {
		size = 0;
		head = null;
	}
	
	//定義連結串列節點類
	private class Node{
		
		private Object data; //定義節點資料
		private Node next;  //定義指向的下一個節點
		public Node(Object data){
			this.data = data;
		}
	}
	
	//新增連結串列的頭結點
	public Object addHead(Object obj){
		Node newNode = new Node(obj);
		if(size==0){
			head = newNode;
		}else{
			newNode.next = head;
			head = newNode;
		}
		size++;
		return obj;
	}
	
	//刪除頭結點
	public Object deleteHead(){
		Object obj = head.data;
		head = head.next;
		return obj;
	}
	
	//查詢指定的元素對應的節點
	public Node find(Object obj){
		int tempSize = size;
		Node node = head;
		while(tempSize>0){
			if(obj.equals(node.data)){
				return node;
			}else{
				node = node.next;
			}
			tempSize--;
		}
		return null;
	}
	
	//刪除指定元素的對應的節點
	public boolean deleteNode(Object obj){
		if(size == 0){
			return false;
		}
		Node firstNode = head;  //當前節點
		Node nextNode = head;   //後一個節點
		while(nextNode.data!=obj){
			if(nextNode.next == null){
				return false;
			}else{
				firstNode = nextNode;
				nextNode = nextNode.next;
			}
		}
		//如果是頭結點的話
		if(nextNode == head){
			head = nextNode.next;
			size--;
		}else{
			firstNode.next = nextNode.next;
			size--;
		}
		return true;
	}
	
	//判斷連結串列是否為空
	public boolean isEmpty(){
		if(size>0){
			return false;
		}else{
			return true;
		}
	}
	
	//列印連結串列
	public void display(){
		if(size>0){
			Node node = head;
			int tempSize = size;
			if(tempSize==1){
				System.out.print("["+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+"->");
				}
				tempSize--;
				node = node.next;
			}
		System.out.println();
		}else{
			System.out.println("[]");
		}
	}
	
}

3.測試一下

	//測試
	@Test
	public void test(){
		SingleLinkedList list = new SingleLinkedList();
		list.addHead("A");
		list.addHead("B");
		list.addHead("C");
		list.addHead("D");
		list.addHead("E");
		list.addHead("F");
		list.display();
		list.deleteNode("C");
		list.display();
		System.out.println("node:"+list.find("F").data);
	}

結果:

[F->E->D->C->B->A]
[F->E->D->B->A]
node:F