1. 程式人生 > >Java中雙鏈表的查詢、插入、刪除等

Java中雙鏈表的查詢、插入、刪除等

雙向連結串列結構和單向連結串列的區別:最後一個結點的連結地址上,單向連結串列是null,而雙向連結串列是表頭的連結地址。

即雙向連結串列的head和last互相指向

示意圖

表頭為空      

 head之前的節點是last=50這個節點 ,head之後的節點是first=10這個節點

last之前是40這個節點,last之後是head這個頭節點

 

雙向連結串列刪除節點

刪除之後    index節點的上一個(20這個節點)的下一個指向index節點的下一個    

index節點的下一個(40這個節點)的上一個指向index節點的上一個

 

雙鏈表新增節點


在index(20這個節點)之前新增   

新增之後  新元素為15這個節點

新元素的下一個指向index(20這個節點)

新元素的上一個指向index的上一個(10這個節點)

系元素的上一個(10這個節點)的下一個指向新元素

新元素的下一個(20這個節點)的上一個指向新元素

 

瞭解上面內容後總結雙向連結串列操作

1)需要有一個節點內部類Node

2)需要有一個頭部head,head沒有值

3)連結串列要實現的操作有:新增add   刪除remove  獲得get

4)add操作分類:

a)從頭部新增,即新增到第一個元素,即在head之後新增

b)從尾部新增,即新增到最後一個元素,即在head之前新增

c)在指定位置index之前新增

d)在指定位置index之後新增

5)remove操作分類:

a)移出first第一個

b)移出last最後一個

c)移出index
 

package cn.xiaoshan.Collection;
 
import cn.xiaoshan.Collection.MyLinkedList;
import cn.xiaoshan.Collection.MyLinkedList.Node;
 
public class MyLinkedList /*implements List*/{
	
	private class Node{
 
		private Node previous = this; 
		private Node next = this;
		private Object value;
		Node (Object value){
			this.value = value;
		}
		
		public String toString(){
			return value.toString();
		}
	}
	
		private Node head = new Node(null);
	
		private int size;
	
		public int getSize(){
		
		return size;
	}
 
	
	private boolean addFirst(Object value){//在前面新增
		addAfter(new Node(value),head);
		return true;
	}
	private boolean addlast(Object value){//在後面新增
		addBefore(new Node(value),head);
		return true;
	}
 
	
	private boolean add(Object value){//預設在後面新增
		addlast(value);
		return true;
	}
	private boolean add(int index,Object value){//在指定節點新增,即在指定節點之前新增
		addBefore(new Node(value),getNode(index));
		return true;
	}
	private Object getValue(int index){//獲得指定位置節點的值
		return getNode(index).value;
	}
 
	
	private boolean remove(int index){//移除指定節點
		removeNode(getNode(index));
		return true;
	}
	private boolean removeFirst(){//刪除前面的節點,從第一個節點開始刪除
		removeNode(head.next);
		return true;
	}
	private boolean removeLast(){//刪除後面的節點,從最後一個節點開始刪除
		removeNode(head.previous);
		return true;
	}
	
	
	private Node getNode(int index){//獲得指定位置的節點
		if(index<0||index>size)//注意這裡判斷條件
			throw new IndexOutOfBoundsException("The Index Outof Bounds");
		if(index<size/2){
		Node node = head;
		for(int i = 0;i<=index;i++){
			node = node.next;
		}
		return node;
	}
	else{
		Node node = head;
		for(int i=size-1;i>=index;--i){
			node = node.previous;
		}
		return node;
	}
}
	private void addBefore(Node newNode,Node node){//在某個節點前面新增
		newNode.next = node;
		newNode.previous = node.previous;
		newNode.previous.next = newNode;
		newNode.next.previous = newNode;
		size++;
	}
	private void addAfter(Node newNode,Node node){//在某個節點後面新增
		newNode.next = node.next;
		newNode.previous = node;
		newNode.previous.next = newNode;
		newNode.next.previous = newNode;
		++size;
	}
	private void removeNode(Node node){//刪除某個節點
		if(size==0)
		throw new IndexOutOfBoundsException("LinkedList is Empty");
		node.previous.next = node.next;
		node.next.previous = node.previous;
		node.next = null;
		node.previous = null;
		--size;
	}
	private boolean isEmpty(){
		return size ==0;
	}
	
	public String toString(){
		StringBuilder str = new StringBuilder(">");
		Node node = head;
		for(int i = 0;i<size;i++){
				node = node.next;
				str.append(node.value);
				str.append(";");
		}
		return str.toString();
	}
	
	public static void main(String[] args) {
		MyLinkedList link = new MyLinkedList();
		
		link.add(4);
		link.add(7);
		link.add(8);
		System.out.println(link);
		link.addFirst(3);
		link.addFirst(2);
		link.addFirst(1);
		System.out.println(link);
		link.addlast(9);
		link.addlast(10);
		System.out.println(link);
		
		link.add(4, "5");
		link.add(5, 6);
		link.add(0, "在0索引出加上:0");
		System.out.println(link);
		link.add(5, "第5個索引新增後獲得這個位置的值");
		System.out.println(link);
		System.out.println(link.getValue(5));
		System.out.println(link.getValue(10));
		System.out.println(link.getValue(11));
//		System.out.println(link.getValue(15));
		
		link.removeFirst();
		System.out.println(link);
		
		link.remove(4);
		System.out.println(link);
		
		System.out.println(link.getSize());
		
		
		link.removeLast();
		link.removeLast();
		link.removeLast();
		link.removeLast();
		link.removeLast();
		System.out.println(link);
		link.removeLast();
		link.removeLast();
		link.removeLast();
		link.removeLast();
		link.removeLast();
		System.out.println(link);
		link.removeLast();
		
		
	}
}

在index(20這個節點)之前新增   

新增之後  新元素為15這個節點

新元素的下一個指向index(20這個節點)

新元素的上一個指向index的上一個(10這個節點)

系元素的上一個(10這個節點)的下一個指向新元素

新元素的下一個(20這個節點)的上一個指向新元素