`
kevin_wanwei
  • 浏览: 117600 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

我的LinkedList的实现类

阅读更多

这个类实现了java List接口,底层完全由链表来实现。(非常好的单链表的例子)

package datasturct;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
 * 我自己实现List 接口的MyLinkList类
 * @author newapps
 *  2009-12-9
 */
public class MyLinkList<T>{
	/**
	 * 节点内部类
	 * @author newapps
	 * @param <T> 表示泛型
	 */
	private  class Node<T>{
		T value;
		Node<T> next;
		
		Node(T value){
			this.value=value;
			this.next=null;
		}
	}
	/**定义链表的头结点*/
	private Node<T> head=null;
	/**
	 * 链表中节点数
	 */
	public int size() {
		Node<T> p;
		int size=0;
		for(p=head;p!=null;p=p.next){
			size++;
		}
		return size;
	}
	/**
	 * 判断该链表的节点数是否为零
	 */
	public boolean isEmpty() {
		if(size()==0){
			return true;
		}
		return false;
	}
	/**
	 * 查找链表中是否含有某个指定节点值的节点
	 * @param o 节点值
	 * @return 是否含有
	 */
	public boolean contains(T o) {
		if(isEmpty()){
			return false;
		}
		Node<T> p;
		for(p=head;p!=null;p=p.next){
			if(p.value.equals(o)){
				return true;
			}
		}
		return false;
	}
	/**
	 * 迭代器方法
	 * @return
	 */
	public Iterator iterator() {
		return new Itor();
	}
	/**
	 * 迭代器的实现类
	 * @author newapps
	 * 2009-12-9
	 */
	private class Itor implements Iterator{
		/**位置*/
		private int index=0;
	//	private int cursor=0;
		public boolean hasNext() {
			
			if(index<size()){
				return true;
			}
			return false;
		}

		public T next(){
			T o = get(index++);
			return o;
		}

		public void remove() {
			MyLinkList.this.remove(size()-1);
		}
		
	}
	/**
	 * 将集合中所有元素作为一个Object[]数组返回
	 * @return
	 */
	public Object[] toArray() {
		if(isEmpty()){
			return null;
		}
		int length=size(),i=0;
		Object[] a=new Object[length];
		Node<T> p;
		for(p=head;p!=null;p=p.next){
			a[i]=p.value;
			i++;
		}
		return a;
	}

	/**
	 * 由于list接口是有序
	 * 所以链表中添加节点数
	 * 应当在最后一个节点位置后添加
	 * @param o 节点值
	 * @return 添加是否成功
	 */
	public void add(T o){
		if(isEmpty()){
			head=new Node<T>(o);	
		}else{
			Node<T> p=head;
			Node<T> node=new Node<T>(o);
			while(p.next!=null){
				p=p.next;
			}
			p.next=node;
			node.next=null;
		}
	}
	/**
	 * 要删除链表中某个节点的值
	 * 首先要找到该节点
	 * 最后才删除
	 * @param o
	 * @return
	 */
	public boolean remove(T o){
		Node<T> p=head,p1=null;
		boolean have=false;
		if(isEmpty()){
			return false;
		}
		while(p!=null){
			if(p.value.equals(o)){
				if(p1==null){
					head=head.next;
				}else{
					p1.next=p.next;
				}
				have=true;
			}
			p1=p;
			p=p.next;
		}
		return have;
	}
	/**
	 * 查找集合中所有元素在该链表中是否也存在
	 * @param c
	 * @return
	 */
	public boolean containsAll(Collection c) {
		if(isEmpty()){
			return false;
		}
		if(c.size()==0){
			return false;
		}
		if(c==null||c.size()>size()){
			return false;
		}
		Iterator it=c.iterator();
		while(it.hasNext()){
			T o=(T)it.next();
			if(!contains(o)){
				return false;
			}
		}
		return true;
	}
	/**
	 * 将集合所有的元素添加到链表中
	 * @param c
	 * @return
	 */
	public boolean addAll(Collection c){
		if(c==null||c.size()==0){
			return false;
		}
		Iterator it=c.iterator();
		while(it.hasNext()){
			T o=(T)it.next();
			add(o);
		}
		return true;
	}
	/**
	 * 从指定的下标位置将集合中所有的元素添加到链表中
	 * @param index
	 * @param c
	 * @return
	 */
	public boolean addAll(int index, Collection c) {
		if(c==null||c.size()==0){
			return false;
		}
		if(isEmpty()){
			addAll(c);
			return true;
		}
		if(index<-1){
			return true;
		}else if(index>=size()){
			addAll(c);
		}else{
			int i=index;
			Iterator it=c.iterator();
			while(it.hasNext()){
				T o=(T)it.next();
				add(i,o);
				i++;
			}
		}
		// 将集合中
		return false;
	}
	/**
	 * 在链表中删除包含集合中的所有元素
	 * @param c
	 * @return
	 */
	public boolean removeAll(Collection c){
		if(c==null||c.size()==0){
			return false;
		}
		if(isEmpty()){
			return false;
		}
		Node<T> p;
		Iterator it=c.iterator();
		while(it.hasNext()){
			T o=(T)it.next();
			remove(o);
		}
		
		return true;
	}
	/**
	 * 在链表中仅保留集合中的元素其余的全部删除
	 * @param c
	 * @return
	 */
	public boolean retainAll(Collection c) {
		if(isEmpty()){
			return false;
		}
		if(c==null||c.size()==0){
			return false;
		}
		
		Node<T> p;
	  for(p=head;p!=null;p=p.next){
		T m=p.value;
		boolean have=false;
		Iterator it=c.iterator();
		 while(it.hasNext()){
			T o=(T)it.next(); 
			if(m.equals(o)){
				have=true;
			}
		   }
		 if(!have){
			 this.remove(m);
		 }
		}
		return true;
	}

	public void clear() {
		head=null;
	}
	/**
	 * 依据指定的下标,找出链表中的元素的值
	 * @param index
	 * @return
	 */
	public T get(int index) {
		int i=-1;
		if(isEmpty()){
			return null;
		}
		if(index<0||index>size()){
			return null;
		}
		Node<T> p=head;
		while(p!=null){
			i++;
			if(i==index){
				return p.value;
			}
			p=p.next;
		}
		return null;
	}
	/**
	 *  替换链表指定位置的元素
	 *  并返回替换前的元素
	 * @param index
	 * @param element
	 * @return
	 */
	public T set(int index, T element) {
		int i=-1;
		if(isEmpty()){
		add(element);
			return null;
		}
		if(index<0||index>size()){
			return null;
		}
		Node<T> p=head;
		T o=null;
		while(p!=null){
			i++;
			if(i==index){
				o=p.value;
				p.value=element;
				return o;
			}
			p=p.next;
		}
		return null;
	}
	/**
	 * 在链表的指定位置添加一个元素
	 * @param index
	 * @param element
	 */
	public void add(int index, T element) {
		int i=-1;
		if(isEmpty()){
			this.add(element);
			return;
		}
		if(index<0||index>size()){
			return;
		}
		Node<T> p=head,p1=null;
		while(p!=null){
			i++;
			if(i==index){
				Node<T> newNode=new Node<T>(element);
				if(p1==null){
					newNode.next=head;
					head=newNode;
				}else{
					p1.next=newNode;
					newNode.next=p;
				}
			}
			p1=p;
			p=p.next;
		}
	}
	/**
	 * 在链表中删除指定位置的元素
	 * @param index
	 * @return
	 */
	public T remove(int index) {
		if(isEmpty()){
			return null;
		}
		if(index<0||index>size()){
			return null;
		}
		Node<T> p=head,p1=null;
		int i=-1;
		while(p!=null){
			i++;
			if(i==index){
				if(p1==null){
					head=head.next;
				}else{
					p1.next=p.next;
				}
				return p.value;
			}
			p1=p;
			p=p.next;
		}
		return null;
	}
	/**
	 * 在链表中返回包含指定元素的下标,如果没有找到则返回-1;
	 * @param o
	 * @return
	 */
	public int indexOf(T o) {
		int i=-1;
		if(isEmpty()){
			return -1;
		}
		Node<T> p=head;
		while(p!=null){
			i++;
			if(p.value.equals(o)){
				return i;
			}
			p=p.next;
		}
		return -1;
	}
	/**
	 * 在链表中找出指定元素最后一次出现的下标
	 * 如果没有找到则返回-1;
	 * @param o
	 * @return
	 */
	public int lastIndexOf(T o) {
		if(isEmpty()){
			return -1;
		}
		Node<T> p=head;
		int i=-1,index=-1;
		while(p!=null){
			i++;
			if(p.value.equals(o)){
				index=i;
			}
			p=p.next;
		}
		return index;
	}
	/**
	 * 链表的打印方法
	 *
	 */
	public void printLinkList(){
		Node<T> p;
		for(p=head;p!=null;p=p.next){
			System.out.print(p.value+"--->");
		}
		System.out.println();
	}
	public static void main(String args[]){
		MyLinkList<String> list=new MyLinkList<String>();
		//System.out.println(list.isEmpty());
		int [] s=new int[5];
		list.add("5");
		list.add("6");
		list.add("7");
		list.add("8");
		Collection c=new ArrayList();
		c.add("9");
		c.add("10");
		c.add("11");
		c.add("8");
		//list.remove("8");
		//list.add(0,"50");
		//list.remove(2);
		//System.out.println(list.set(2,"100"));
		//System.out.println(list.get(2));
		//list.addAll(c);
		//list.printLinkList();
		//list.retainAll(c);
		list.addAll(2,c);
		list.printLinkList();
		Iterator it=list.iterator();
		while(it.hasNext()){
			System.out.print(it.next()+"---");
		}
//		it.remove();
//		it.remove();
//		it.remove();
//		it.remove();
		list.clear();
		list.printLinkList();
		//System.out.println(list.indexOf("9"));
		//System.out.println(list.lastIndexOf("8"));
		//System.out.println(list.contains("10"));
	}
}

 

 

 

 

分享到:
评论

相关推荐

    模拟实现 LinkedList 测试类

    模拟实现 LinkedList 测试类

    链表类LinkedList的完全c++实现

    链表类LinkedList的完全c++实现,根据数据结构与算法课堂总结。

    java中LinkedList集合类实现栈和队列.doc

    在Java编程语言中,LinkedList集合类是一个非常重要的数据结构,它可以用来实现栈和队列这两种特殊的数据结构。LinkedList是一个双链表,每个节点包含数据元素和两个引用,分别指向前后节点,这使得在列表中进行插入...

    LinkedList的实现.zip

    最后,`LinkedList`文件可能是实现了链表类的主体,该类封装了链表操作并提供了一种面向对象的方式来使用链表。这个类可能包含了构造函数、析构函数,以及在`List.h`中声明的方法的实现。例如,链表类的构造函数可能...

    用LinkedList实现队列和栈

    在Java编程语言中,`LinkedList` 是一个常用的集合类,它实现了`List`接口,并且提供了额外的功能,如双端操作。本篇文章将探讨如何利用`LinkedList`来实现队列和栈这两种数据结构,以及其背后的原理和源码分析。 #...

    JavaScript 实现基础 LinkedList 功能

    在JavaScript中实现LinkedList,我们需要理解其基本概念、操作以及如何用原生JavaScript对象来模拟链表结构。 首先,LinkedList由一系列节点(Node)组成,每个节点包含两部分:数据和指向下一个节点的引用。在...

    LinkedList实现栈

    首先,LinkedList类位于Java的`java.util`包中,它实现了List接口,允许我们存储和操作一系列元素。LinkedList内部维护了一个双向链表,每个元素都是一个Node对象,包含元素值以及指向前后节点的引用。由于...

    javascript集合类 LinkedList代码实现

    以下是一个简单的LinkedList实现: ```javascript // 定义Node类 class Node { constructor(data, next = null) { this.data = data; this.next = next; } } // 定义LinkedList类 class LinkedList { ...

    LinkedList实现List一些方法

    5. **迭代器**: LinkedList实现了Iterator接口,提供`iterator()`方法用于遍历列表。LinkedList的迭代器允许我们按顺序遍历元素,同时支持`hasNext()`、`next()`和`remove()`操作。与ArrayList不同,LinkedList的...

    链表+泛型+反射实现自定义的LinkedList集合类

    本资源通过实现一个自定义的LinkedList集合类,深入探讨了如何将链表、泛型和反射这三个关键知识点结合在一起。 首先,链表在Java中的标准实现是`java.util.LinkedList`类,它提供了添加、删除、查找等操作,支持...

    源码解析jdk7.0集合:LinkedList的底层实现原理.pdf

    首先,LinkedList实现了List接口,因此它是一个有序列表。它还实现了Deque接口,这意味着LinkedList支持双端队列的操作。除了这些接口之外,LinkedList还是Cloneable和java.io.Serializable的,表示它可以被克隆以及...

    Java用LinkedList实现的Stack

    栈是先进先出的原则,该类实现了栈的移入移除

    Java 中Linkedlist类的源代码

    在Java编程语言中,LinkedList是一个实现List接口的类,它以双向链表的形式存储元素。这个数据结构允许我们在列表的任何位置进行插入和删除操作,具有O(1)的时间复杂度,这使得LinkedList在需要频繁进行这些操作时比...

    JAVA利用LinkedList构造栈与队列

    这两个类(Stack和Queue)虽然基于LinkedList实现,但它们都提供了抽象数据类型的接口,隐藏了底层的实现细节,使得代码更具有封装性和可复用性。在实际项目中,如果对性能有较高要求,通常会使用专门的栈(如...

    使用LinkedList模拟堆栈

    本文将详细讲解如何使用Java中的LinkedList类来模拟这两种数据结构,并实现其基本操作。 堆栈(Stack)是一种后进先出(LIFO, Last In First Out)的数据结构,它遵循“先进后出”的原则。常见的堆栈操作有压栈...

    ArrayList LinkedList Vector区别

    ArrayList、LinkedList、Vector 是 Java 中常用的数据结构实现类,它们都实现了 List 接口,但它们在存储方式、性能、线程安全性等方面有着不同特点。 首先,ArrayList 和 Vector 都是采用数组方式存储数据的,这种...

    创建一个 LinkedList项目.docx

    - LinkedList 继承自 AbstractSequentialList,这是一个抽象类,提供了部分 List 操作的默认实现。 - LinkedList 实现了 List 接口,因此可以执行所有 List 相关的操作,如添加、删除、查找元素等。 - LinkedList ...

    LinkedList实践代码

    在实践中,我们可以编写代码来演示如何使用LinkedList实现二叉树的构建和遍历。例如,创建一个BinaryTreeNode类,然后用LinkedList来存储节点,通过调整节点的引用关系来构建二叉树,并实现遍历方法。这样的练习有助...

    List-LinkedList 单链表就地反转

    ### List-LinkedList 单链表就地反转 #### 概述 本文主要介绍单链表的就地反转算法实现,并通过具体的C语言代码示例来解释这一过程。...对于初学者来说,理解并熟练掌握这类基本操作是非常有帮助的。

Global site tag (gtag.js) - Google Analytics