单链表之Java实现

来源:互联网 发布:ubuntu 升级pip 失败 编辑:程序博客网 时间:2024/05/18 08:12

单链表介绍

我们将处理一般的形如A1,A2,A3.....An的表。我们说这个表的大小是N,我们称大小为零的表为空表。对于除空表以外的任何表,我们说A2后继A1,并称A1是A2的前驱。

                                                                                                                                                                          ——摘自《数据结构与算法分析》

为了避免删除和添加的开销,我们需要允许表可以不连续存储,否则表的部分或者全部就可能需要整体移动。链表的结构如下图:

链表由一系列不必在内存中相连的结构组成,每个结构都包含自己本身对象值以及next结构的引用。


实现:

Node.java如下:

package com.lemon;public class Node<T> {Node<T> next=null;//指向下个对象T value=null;//当前对象的值public Node(T currentData) {this.value = currentData;}}


MyLinkedList<T>.java 如下:

package com.lemon;/** *  * @author an.yan * @param <T> */public class MyLinkedList<T> {/** * the size of list */private int size;/** * the first object of list */private Node<T> headNode;/** * add an object to the first of list * @param object */public void addFirst(T object) {     Node<T> newNode = new Node<T>(object);     newNode.next = headNode;     headNode = newNode;  size++;}/** * add an object to the last of list * @param object */public void add(T object){if(size==0){headNode=new Node<T>(object);}else{Node<T> newNode = new Node<T>(object);     Node<T> p = headNode;     while (p.next != null){p = p.next;     }p.next = newNode;     }size++;}/** * insert an object to the specified position which is the index of list * @param object * @param index */public void add(T object,int index){rangeCheck(index);if(index==0){addFirst(object);return;}else{Node<T> currentNode=headNode;Node<T> prev = null; int i=1;while(true){if(index!=1){currentNode=currentNode.next;}prev=currentNode.next;if(i==index){Node<T> oNode=new Node<T>(object);currentNode.next=oNode;oNode.next=prev;break;}i++;}}size++;}/** * return a int vaule which is the index of the first occurrence of the specified object * @param object * @return index */public int indexOf(T object){int index = 0;     Node<T> p;     for(p = headNode; p != null; p = p.next) {     if(object.equals(p.value))   {return index;                 }index++;     }     return -1;     }/**  * remove an object from the head of list  */  public void removeFirst() {  if (!isEmpty()) {headNode = headNode.next;size--;}else{System.out.println("The list have been emptied!");}}/**  * remove an object from the head of list  */  public void removeLast() {  if (!isEmpty()) {Node<T> prev = null;Node<T> curr = headNode;     while(curr.next != null) {     prev = curr;     curr = curr.next;     }     if(curr.next == null){prev.next = null;}size--;}else{System.out.println("The list have been emptied!");}}/** * return an array which contains all object of current list(from first to last) * @return result */public Object[] toArray(){Object[] result=null;if(isEmpty()){return result;}result=new Object[size];for(int i=0;i<result.length;i++){result[i]=headNode.value;headNode=headNode.next;}return result;}/** * return a boolean value,if it's true,then means the list is contains this obj, * otherwise,the list isn't contains it. * @param object * @return result */public boolean contains(T object){return indexOf(object)!=-1;}/** * check the range of index * @param index */private void rangeCheck(int index){if (index >= size||index<0){throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);}}/** * remove an object from list * @param object * @return result */public boolean remove(T object){boolean result=false;Node<T> curr = headNode;Node<T> prev = null; while (curr != null) {  if (object.equals(curr.value)) {  if (prev == null)  {removeFirst();}  else {prev.next = curr.next;}  result=true;size--;break;} else {  prev = curr;  curr = curr.next;}  }  return result;}/** * remove obj by index * @param index * @return a obj which removed from list */public T remove(int index){rangeCheck(index);T item=get(index);remove(item);return item;}/** * get a object by index which belong to list * @param index * @return result */public T get(int index){rangeCheck(index);T result=null;Node<T> curr = headNode;   for (int n = 0; n < size; n++) {   if (n == index){   result=curr.value;return result;   }else{curr = curr.next;}}   return result;  }/** * remove all of the objects from current list. */public void clear() {headNode=null;size=0;}/** * return a number which is the size of list * @return size */public int size(){return size;}/** * if there is no object in list,then return true; * otherwise return false * @return size?=0 */public boolean isEmpty(){return size==0;}}

测试如下:

package com.lemon;public class TestMain {/** * @param args */public static void main(String[] args) {MyLinkedList<String> list=new MyLinkedList<String>();list.add("yanan");list.add("changlinNa");list.add("changlinmeng");list.add("changlinfang");list.add("zhiyuan");/** * 测试remove() get() *///String removed=list.remove(2);//System.out.println("removed:"+removed);//for(int i=0;i<list.size();i++){//System.out.println(list.get(i));//}/** * 测试toArray() *///Object[] objs=list.toArray();////for(Object obj:objs){//System.out.println(obj);//}/** * 测试 contains() *///System.out.println(list.contains("changlidfdfnNa111"));/** * 测试 indexOf() *///System.out.println(list.indexOf("changlinmeng"));/** * 测试 add(T,int) * {"yanan","changlinNa","changlinmeng","changlinfang","zhiyuan"}; *///list.add("mengjiao", 4);//for(int i=0;i<list.size();i++){//System.out.println(list.get(i));//}/** * 测试 remove(T object) *///System.out.println("删除之前--------------:");//for(int i=0;i<list.size();i++){//System.out.println(list.get(i));//}//list.remove("changlinmeng");//System.out.println("-------------删除之后:");//for(int i=0;i<list.size();i++){//System.out.println(list.get(i));//}///**// * 测试removeFirst()// *///list.removeFirst();//for(int i=0;i<list.size();i++){//System.out.println(list.get(i));//}///**// * 测试removeLast()// *///list.clear();//list.add("a");//list.add("b");//list.add("c");//list.add("d");//list.removeLast();////for(int i=0;i<list.size();i++){//System.out.println(list.get(i));//}/** * 测试removeLast() */list.clear();list.add("a");for(int i=0;i<list.size();i++){System.out.println(list.get(i));}}}


原创粉丝点击