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這個節點)的上一個指向新元素