單鏈表:
節點包含屬性:節點自身值,一個指向下個節點的引用;
與數組的相比的優越性:新增或刪除元素是不需要騰出空間或是填補空缺
具體實現見代碼:
package org.com.data_structure.node.demo;</p><p>/**<br /> * 節點介面<br /> * @author Administrator<br /> *<br /> */<br />public interface Node<E> {</p><p>E getData(); //擷取節點資料</p><p> void setData(); //設定節點資料<br />}</p><p>package org.com.data_structure.node.demo;</p><p>/**<br /> * 單向鏈表的實現 允許重複的元素<br /> * @author Administrator<br /> *<br /> * @param <E><br /> */<br />public class SingleLinkNode<E> implements Node<E> {<br /> private E element;//當前儲存的對象<br /> private SingleLinkNode<E> next; //指向下一個節點的引用<br /> private SingleLinkNode<E> head = this; //啞元 的next指向0位的元素<br /> private int size = 0; //鏈表的長度</p><p> public SingleLinkNode(){</p><p>}</p><p>/**<br /> * 設定當前節點的值<br /> * @param element<br /> */<br />public void setElement(E element){<br /> this.element = element;<br />}</p><p>@Override<br />public void setData() {</p><p>}</p><p>/**<br /> * 鏈表的長度<br /> * @return<br /> */<br />public int size(){<br />return size;<br />}<br />/**<br /> * 返回指向節點的引用<br /> * @return<br /> */<br /> public SingleLinkNode<E> getNext() {<br /> return next;<br />}<br /> /**<br /> * 設定當前節點的下一個節點<br /> * @param next<br /> */<br />public void setNext(SingleLinkNode<E> next) {<br />this.next = next;<br />}<br />/**<br /> * 獲得當前節點的值<br /> */<br />@Override<br />public E getData() {<br />// TODO Auto-generated method stub<br />return element;<br />}<br />/**<br /> * 單鏈表增加一個元素 在鏈表尾添加一個節點<br /> * @param e<br /> */<br />public void add(E e){<br />SingleLinkNode<E> newnode = new SingleLinkNode<E>(); //新的節點<br />newnode.setElement(e); //設定節點值<br />SingleLinkNode<E> nodenext = head.next;<br />if(nodenext != null){<br />int num = size;<br />for(;num >1;num --)<br />nodenext = nodenext.getNext();<br />nodenext.setNext(newnode);<br />}<br />else{<br />head.setNext(newnode);<br />}<br />size = size +1;<br />}</p><p>/**<br /> * 根據給定索引值返回相應位置的值<br /> * @param index<br /> * @return 小標從0開始<br /> */<br />public E get(int index){<br />if(index < 0 || index >= size)<br />throw new IndexOutOfBoundsException("傳入了一個不合理的數 "+index);<br />else{<br />SingleLinkNode<E> next1 = head.getNext();<br />if(size == 1)<br />return next1.getData();<br />else{<br /> for(;index>0;index--)<br /> next1 = next1.getNext();<br /> return next1.getData();<br /> }<br />}<br />}<br />/**<br /> * 返回元素第一次出現的位置<br /> * -1表示沒有找到<br /> * @param element<br /> * @return<br /> */<br />public int indexOf(E element){<br />SingleLinkNode<E> node = head.next;<br />if(node == null)<br />return -1;<br />int num = 0;<br />while(node!=null){<br />num++;<br />if(node.getData().equals(element)){<br />return num;<br />}<br />node = node.getNext();<br />}</p><p>return -1;<br />}</p><p>/**<br /> * 刪除指定位置的節點<br /> * @param index 小標從1開始 1表式第一個元素<br /> */<br />public void remove(int index){<br />if(index<0 || index>size)<br />throw new IndexOutOfBoundsException("傳入參數不合理 "+index);<br />SingleLinkNode<E> node = head.getNext(); //指向第一個元素<br />int num = 1;<br />SingleLinkNode<E> pre = null; //上一個元素<br />SingleLinkNode<E> next1 = null; //下一個元素<br />if(index == 1){<br />head.setNext(node.getNext()); //若indxe == 1 則用下一個元素取代第一個元素<br />size = size -1; //鏈表長度-1<br />return; //返回<br />}<br />while(node != null){<br /> num++;<br /> if(num == index){<br /> pre = node;<br /> next1 = pre.getNext().getNext();<br /> pre.setNext(next1);<br /> break; //結束<br /> }<br /> node = node.getNext();<br />}<br />size = size -1;<br />}</p><p>/**<br /> * 將鏈錶轉化為對象數組形式<br /> * @return<br /> */<br />public Object[] getArray(){<br />Object[] array = new Object[size];<br />SingleLinkNode<E> node = head.getNext();<br />if(node == null)<br />return array;<br />for(int i=0;i<size;i++){<br />array[i] = node.getData();<br />node = node.getNext();<br />}<br />return array;<br />}</p><p>/**<br /> * 刪除鏈尾元素<br /> */<br />public void remove(){<br />SingleLinkNode<E> node = head.getNext();<br />if(size == 0 || size == 1){<br />head.setNext(null);<br />size = 0;<br />return;<br />}<br /> int mun = 1;<br />while(true){<br />mun++;<br />if(mun == size){<br />node.setNext(null);<br />break;<br />}<br />node = node.getNext();<br />}<br />size = size - 1;<br />}</p><p>/**<br /> * 判斷當前鏈表是否包含給定的對象,若存在則返回true 否則返回false<br /> * @param element<br /> * @return<br /> */<br />public boolean contains(E element){<br />SingleLinkNode<E> node = head.getNext();<br />boolean isexit = false;<br />if(node == null)<br />return false;<br />while(node!=null){<br />if(node.getData().equals(element))<br />{<br />isexit = true;<br />break;<br />}<br />node = node.getNext();<br />}<br />return isexit;<br />}</p><p>/**<br /> * 刪除指定元素第一次出現的位置<br /> * @param e<br /> */<br />public void remove(E e){<br />SingleLinkNode<E> node = head.getNext();<br />if(node == null)<br />return ;<br />while(node != null){<br />if(node.getData().equals(e))<br />break;<br />node = node.getNext();<br />}<br />}</p><p>/**<br /> * 將元素增加在指定位置上<br /> * @param index 位置 若index>size 則在鏈表的最後位置添加元素<br /> * @param e 待增加元素<br /> */<br />public void add(int index,E e){<br />SingleLinkNode<E> node = head.getNext();<br />SingleLinkNode<E> newnode = new SingleLinkNode<E>();<br />newnode.setElement(e);<br />if(index>size){ //若index>size則在鏈表的尾添加節點<br />add(e);<br /> return;<br />}<br />if(index <= 0){<br />throw new IndexOutOfBoundsException("傳入的參數index不合理 "+index);<br />}<br />if(node == null){<br /> node.setNext(newnode);<br /> size = size +1;<br /> return;<br />}<br />if(index == 1){<br /> newnode.setNext(node);<br /> head.setNext(newnode);<br /> size = size +1;<br /> return;<br />}<br />int mun = 1;<br />while(node != null){<br />mun++;<br />if(mun == index){<br /> SingleLinkNode<E> pre = node;<br /> newnode.setNext(pre.next);<br /> node.setNext(newnode);<br /> size = size +1;<br /> break;<br />}<br />node = node.getNext();<br />}</p><p>}<br />}<br />
很遺憾的是 我自己測試它和數組的效率(新增元素)時 竟然比數組的效率還低 ,想各位前輩討教下 :