单链表之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));}}}
- 单链表之Java实现
- 单链表之java实现
- JAVA 之 数据结构:实现单链表
- 用JAVA实现数据结构之单链表
- java数据结构之单链表的简单实现
- Java数据结构之单链表的实现
- 单链表Singly Linked List之JAVA实现
- 数据结构之单链表的Java实现
- 红黑树之java实现
- JAVA之UUID实现
- java 之ArrayList实现
- HashMap之Java实现
- poj1860之java实现
- HashMap之JAVA实现
- CRC32之JAVA实现
- 基数排序之java实现
- 二维码之java实现
- 二叉排序树之Java实现
- 观察者设计模式
- oracle内存碎片
- 问题六十八: 在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。 选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。
- Hadoop Run on openstack
- vs2010 下编译 libjingle 库
- 单链表之Java实现
- 489 - Hangman Judge
- 《unix网络编程》基本套接口编程
- ActivityGroup相关--getLocalActivityManager()
- Android优秀开源项目 UI项目居多
- smarty内建函数讲解
- android 开发布局之LinearLayout
- GDB调试精粹及使用实例(From ChinaUnix)
- eBook learning