链表用java实现简单单链表linkedlist
生活随笔
收集整理的這篇文章主要介紹了
链表用java实现简单单链表linkedlist
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。
每個結點包括兩個部分:
1是存儲數據元素的數據域data
2是存儲下一個結點地址的指針域p。
相比于線性表的優點:插入和刪除結點方便。(插入刪除的圖都不畫了,辦公軟件不好用)
這里是對單鏈表的理解,并用java的泛型實現,當然與java集合提供的API ?LinkedList<E>還是有些不同的,在此只作為理解。
project
首先構造一個Node結點泛型類,結點里的數據類型是泛型E
public class Node<E> {E element;//元素Node<E> next; //指針public Node(E e){element=e;} } MyAbstractList.java抽象類實現MyList.java,對接口部分實現,MyLinkedList.java繼承 MyAbstractList.java抽象類
MyList.java
public interface MyList<E> {//添加一個元素public void add(E e);//在index處添加一個元素public void add(int index,E e);//清楚一個list列表public void clear();//刪除一個元素public boolean remove(E e);//刪除并返回index處的元素public E remove(int index);//index處的元素設置為元素epublic Object set(int index,E e);//判斷是否包含元素epublic boolean contains(E e);//返回index處的元素public E get(int index);//返回列表中第一個與元素e匹配的下標indexpublic int indexOf(E e);//返回列表中最后一個與元素e匹配的元素下標indexpublic int lastIndeOf(E e);//判斷列表是否為空public boolean isEmpty();//返回列表的大小public int size(); } MyAbstractList.java
MyLinkedList.java
public class MyLinkedList<E> extends MyAbstractList<E>{private Node<E> head,tail;public MyLinkedList(){ }public MyLinkedList(E[] objects){super(objects);}//返回頭元素public E getFirst(){if(size==0){return null;}else{return head.element;} }//返回尾元素public E getLast(){if(size==0){return null;}else{return tail.element;} }//添加首元素public void addFirst(E e){Node<E> newNode=new Node<E>(e);newNode.next=head;head=newNode;size++;if(tail==null)tail=head;}//添加尾元素public void addLast(E e){Node<E> newNode=new Node<E>(e);if(tail==null){head=tail=newNode;}else{tail.next=newNode;tail=tail.next;}size++;}//在index處添加元素public void add(int index,E e){if(index==0) addFirst(e);else if(index>=size) addLast(e);else{Node<E> current=head;for(int i=1;i<index;i++)current=current.next;Node<E> temp=current.next;current.next=new Node<E>(e);(current.next).next=temp;size++;}}//刪除并返回首元素public E removeFirst(){if(size==0)return null;else if(size==1){Node<E> temp=head;head=tail=null;size=0;return temp.element;}else{Node<E> temp=head;head=head.next; size--;return temp.element;}}//刪除并返回尾元素public E removeLast(){if(size==0)return null;else if(size==1){Node<E> temp=head;head=tail=null;size=0;return temp.element;}else{Node<E> current=head;for(int i=0;i<size-2;i++){current=current.next;}Node<E> temp=tail;tail=current;tail.next=null;size--;return temp.element;}}//刪除并返回index處的元素public E remove(int index){if(index<0||index>=size) return null;else if(index==0) return removeFirst();else if(index==size-1) return removeLast();else{Node<E> previous=head;for(int i=1;i<index;i++){previous=previous.next;}Node<E> current=previous.next;previous.next=current.next;size--;return current.element;}}public String toString(){StringBuilder result=new StringBuilder("[");Node<E> current=head;for(int i=0;i<size;i++){result.append(current.element);current=current.next;if(current!=null){result.append(",");}else{result.append("]");} }return result.toString();}public void clear(){head=tail=null;}//是否包含元素epublic boolean contains(E e){Node<E> current=head;for(int i=0;i<size;i++){if(current.element.equals(e)){return true;}else{current=current.next;}} return false;}//返回index處的元素public E get(int index){//index都是從0 算起的,size是從1算起的if(index<0||index>=size) return null;else if(index==0) return head.element;else if(index==size-1) return tail.element;else{Node<E> current=head;for(int i=1;i<index;i++)current=current.next;Node<E> temp=current.next;return temp.element;} }public int indexOf(E e){if(size==0) return -1;else {Node<E> current=head;for(int i=0;i<size;i++){if(current.element.equals(e))return i;else current=current.next;} }return -1;}public int lastIndexOf(E e){if(size==0) return -1;else {Node<E> current=tail;for(int i=size-1;i>=0;i--){if(current.element.equals(e))return i;else current=current.next;} }return -1;}//在index處的元素設置為epublic E set(int index,E e){if(index<0||index>=size) return null;else{Node<E> current=head;for(int i=1;i<index;i++)current=current.next;Node<E> old=current.next;E oldE=old.element;old.element=e;return oldE; }} }
TestMyLinkedList.java
public class TestMyLinkedList {public static void main(String[] args) {MyList<String> list=new MyLinkedList<>();list.add("America");System.out.println("(1)"+list);list.add(0,"Canada");System.out.println("(2)"+list);list.add("Russia");System.out.println("(3)"+list);list.add("France");System.out.println("(4)"+list);list.add(2,"Gemany");//在索引2的位置插入System.out.println("(5)"+list);list.add(5,"Norway");//在索引5的位置插入System.out.println("(6)"+list);list.remove("Canada");//移出System.out.println("(7)"+list);list.remove("2");//移出索引2的元素System.out.println("(8)"+list);list.remove(list.size()-1);System.out.println("(9)"+list);}}
測試結果:
(1)[America]
(2)[Canada,America]
(3)[Canada,America,Russia]
(4)[Canada,America,Russia,France]
(5)[Canada,America,Gemany,Russia,France]
(6)[Canada,America,Gemany,Russia,France,Norway]
(7)[America,Gemany,Russia,France,Norway]
(8)[America,Gemany,Russia,France,Norway]
(9)[America,Gemany,Russia,France]
總結
以上是生活随笔為你收集整理的链表用java实现简单单链表linkedlist的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hibernate的3种继承映射关系总结
- 下一篇: java集合框架LinkedList类的