`

Java数据结构与算法_链表

 
阅读更多

Java数据结构与算法_链表

     数组作为数据存储结构有一定的缺陷,在无序的数组中,搜索是低效的;而在有序数组中,插入效率又很低;不管在哪一种数组中删除效率都很低。况且一个数组创建后,它的大小不能改变,链表就能够解决数组插入、删除效率低问题。

     链表在表头插入和删除速度很快。仅需要改变一两个引用值,所以花费O(1)的时间。平均起来,查找、删除和指定节点后面插入都需要搜索链表中一般链接点,需要O(N)次比较。在数组中执行这些操作也需要O(N)次比较,但是链表任然要快一些,因为要插入和删除链接点时,链表不需要移动任何东西。

      链表是继数组后第二中使用得最广泛的通用存储结构。

 

下面的使用Java代码实现双向链表:

 

1:链表Interface

 

public interface ListX<E> {

	public int size(); // 表数据总数

	public boolean isEmpty(); // 是否为空
	
	 /**
     * Appends the specified element to the end of this list
	  * @param e Element will be appends to the list
	  * @return
	  */
	 boolean add(E e);
	 
	 /**
	  * Insert the element at the specified position in the list with specified element 
	  * @param index
	  * @param element
	  */
	 void add(int index, E element);
	 
	 /**
	  * Remove the element at the specified position in this list
	  * @param index
	  * @return
	  */
	 E remove(int index);
	 
	 
	 /**
	  * Removes the first element from the list 
	  * @param o
	  * @return
	  */
	 boolean removeFirst();
	 
	 /**
	  * Return the element at the specified position of list
	  * @param index
	  * @return
	  */
	 E get(int index);
	 
	 /**
	  * Return the element at the first position of list
	  * @param index
	  * @return
	  */
	 E getFirst();
	 
	 /**
	  * Return the element at the last position of list
	  * @return
	  */
	 E getLast();
	 
	 boolean contains(E e);
}

 

 

2:结点类Entry

      Entry是放在LinkedListX中的内部静态类

 

	/**
	 * 节点类, 代表链表中的每一个节点。 
	 * @author xusy
	 *
	 * @param <E>
	 */
	private static class Entry<E> {
		E element;
		Entry next;
		Entry previous;

		public Entry(E e, Entry<E> previous, Entry<E> next) {
			this.element = e;
			this.next = next;
			this.previous = previous;
		}
	}

 

 

3:链表LinkedListX

import java.util.NoSuchElementException;

public class LinkedListX<E> implements ListX<E> {
	private int size;
	private Entry header = new Entry<E>(null, null, null);

	public LinkedListX() {
		header.next = header.previous = header;
	}
	
	
	/**
	 * 节点类, 代表链表中的每一个节点。 
	 * @author xusy
	 *
	 * @param <E>
	 */
	private static class Entry<E> {
		E element;
		Entry next;
		Entry previous;

		public Entry(E e, Entry<E> previous, Entry<E> next) {
			this.element = e;
			this.next = next;
			this.previous = previous;
		}
	}

	public E getFirst() {
		if (size == 0)
			throw new NoSuchElementException();
		return (E) header.next.element;
	}

	public E getLast() {
		if (size == 0)
			throw new NoSuchElementException();
		return (E) header.previous.element;
	}

	public void addFirst(E element) {
		addBefore(element, header.next);
	}

	public void addLast(E element) {
		addBefore(element, header);
	}

	public boolean contains(E e) {
		int index = indexOf(e);
		return index != -1;
	}

	public E remove(Entry e) {
		e.previous.next = e.next;
		e.next.previous = e.previous;

		E element = (E) e.element;
		e.next = null;
		e.previous = null;
		e.element = null;

		size--;
		return element;
	}

	private int indexOf(E o) {
		int index = 0;
		if (o == null) {
			for (Entry e = header.next; e != header; e = e.next) {
				if (e.element == null)
					return index;
				index++;
			}
		} else {
			for (Entry e = header.next; e != header; e = e.next) {
				if (o.equals(e.element))
					return index;
				index++;
			}
		}
		return -1;
	}

	private void addBefore(E element, Entry entry) {
		Entry newEntry = new Entry<E>(element, entry.previous, entry);
		newEntry.next.previous = newEntry;
		newEntry.previous.next = newEntry;

		size++;
	}

	@Override
	public int size() {
		return size;
	}

	@Override
	public boolean isEmpty() {
		return size == 0;
	}

	@Override
	public boolean add(E e) {
		addLast(e);
		return true;
	}

	@Override
	public void add(int index, E element) {
		Entry entry = index(index);
		addBefore(element, entry);
	}

	private Entry index(int index) {
		if (index < 0 || index > size)
			throw new IndexOutOfBoundsException();

		Entry entry = header.next;
		while (index > 0) {
			entry = entry.next;
		}

		return entry;
	}

	@Override
	public E remove(int index) {
		Entry entry = index(index);
		return remove(entry);
	}

	@Override
	public boolean removeFirst() {
		if (size == 0)
			throw new NoSuchElementException();

		remove(header.next);

		return true;
	}

	@Override
	public E get(int index) {
		return (E) index(index).element;
	}

	public void insertSort(int[] array){
		int in,out,temp;
		for(out=1;out<array.length;out++){
			temp = array[out];
			in=out;
			while(in>0&&array[in]>temp){
				array[in]=array[in-1];
				in--;
			}
		array[in]=temp;
		}
	}
}

 

分享到:
评论

相关推荐

    java数据结构与算法.pdf

    Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点进行详细解释。 1. **数据结构**: - **稀疏数组**:当大量数据中大部分为零或...

    java数据结构与算法中文版

    《Java数据结构与算法中文版》是一本深入探讨编程核心领域的书籍,主要针对Java程序员,旨在提升他们在数据处理和问题解决能力上的技能。这本书详细介绍了数据结构和算法的基础理论及其在Java语言中的实现,是Java...

    Java数据结构和算法中文第二版_Java数据结构_

    《Java数据结构和算法中文第二版》是一本深入探讨Java编程中数据结构和算法的书籍。数据结构是计算机科学的基础,它涉及到如何有效地组织和存储数据,以便在各种操作下高效地访问和修改。算法则是解决问题的具体步骤...

    数据结构与算法分析_java语言描述_Mark_Allen_Weiss著_课后习题答案

    根据提供的文件信息,以下是关于《数据结构与算法分析_java语言描述_Mark_Allen_Weiss著_课后习题答案》中所涉及的知识点。 首先,本书的标题明确指出了它主要关注两个方面:数据结构和算法分析,同时使用Java语言...

    Java数据结构和算法.pdf

    资源摘要信息是关于Java数据结构和算法的知识点总结,涵盖了数组、栈与队列、链表、递归、哈希表、高级排序、二叉树、红黑树、堆、带权图等数据结构和算法概念。 一、数组 * 数组是相同类型变量的集合,可以使用...

    C、C++、JAVA数据结构与算法电子书

    数据结构与算法是计算机科学的基础,对于理解和编写高效软件至关重要。C、C++和Java都是广泛使用的编程语言,它们在处理数据结构和算法时各有特点。以下是对这三种语言在数据结构与算法方面的一些关键知识点的详细...

    Java数据结构与算法第二版源代码

    《Java数据结构与算法第二版源代码》是一个深入学习Java编程和算法的重要资源,它包含了丰富的实例和程序,旨在帮助开发者提升对数据结构和算法的理解与应用能力。在这个压缩包中,有两个主要的子文件:...

    Java数据结构和算法中文第二版

    根据提供的信息,“Java数据结构和算法中文第二版”这本书主要关注的是数据结构与算法的相关内容。下面将基于这些信息,详细介绍数据结构与算法的核心概念、重要性和应用领域,以及在Java编程环境中如何实现这些概念...

    01_Java版数据结构与算法 02_算法_直通BAT算法精讲

    数据结构1.pptx 2X1{SH5V_HSM`5JS[H]Z`JP.png 33XTI0U)]QTVK1MINJY0)F3.png 34MMEH64LMCA}H5G_RXKPGO.png 65]YTLJ{NP7ICB9{]%XK5J2.png 73I2ZJ(3Z5XWL3W1LFVZRCR.png MQJ[~8HPO2L{35`{CY8{WXO.png P)(%S5}WL7HD(09E1...

    数据结构与算法资料_数据结构与算法_

    数据结构与算法是计算机科学的基础,对于理解和设计高效的软件至关重要。在Java编程中,掌握数据结构和算法能够帮助开发者编写出性能优越、可维护性高的代码。以下将详细阐述相关知识点。 1. **数据结构**: 数据...

    Java 数据结构与算法+源代码 高清版

    这份“Java数据结构与算法+源代码高清版”资源旨在帮助开发者深入理解并掌握这些关键概念。 首先,让我们来探讨数据结构。数据结构是组织和存储数据的方式,它为算法提供了基础。常见的数据结构包括数组、链表、栈...

    数据结构与算法分析_Java语言描述(第3版)完整源码

    《数据结构与算法分析_Java语言描述(第3版)》是一本权威的教材,涵盖了这一领域的基础到高级知识,通过完整的源码,读者可以深入理解并实践这些概念。 首先,我们来看看提供的压缩包中包含的一些关键文件: 1. **...

    Java数据结构和算法(第二版)+源代码+Applets

    Java数据结构和算法是计算机科学中的核心概念,对于任何Java开发者来说,理解和掌握它们都是至关重要的。本资源包“Java数据结构和算法(第二版)+源代码+Applets”为学习者提供了一个全面且深入的学习平台,涵盖了...

    数据结构与算法代码详解JAVA版

    本资源"数据结构与算法代码详解JAVA版"聚焦于使用Java语言来理解和实现这些核心概念。 首先,数据结构是组织和存储数据的方式,它为高效地执行各种操作提供了便利。常见的数据结构包括数组、链表、栈、队列、树(如...

    java数据结构与算法分析

    在编程领域,Java数据结构与算法分析是提升编程能力、优化程序效率的关键所在。本资料集专注于Java语言,深入探讨了各种数据结构和算法,旨在帮助Java开发者更好地理解和运用这些核心概念。 首先,数据结构是存储和...

    java数据结构与算法1

    在IT行业中,Java数据结构与算法是编程人员必备的基础知识,尤其对于提升软件开发效率和优化解决方案至关重要。这里我们主要探讨的是"java数据结构与算法1"的相关知识点,结合提供的压缩包文件,我们可以深入学习...

    数据结构与算法分析_Java语言描述(第2版) 源代码

    《数据结构与算法分析_Java语言描述(第2版) 源代码》是一本深入探讨数据结构和算法的书籍,其源代码是学习和理解书中理论的重要实践资源。这本书籍主要面向计算机科学专业的学生以及对算法有深入研究需求的开发者。...

    JAVA数据结构与算法

    在编程领域,数据结构与算法是核心基础,对于任何编程语言,包括Java,理解并熟练掌握它们至关重要。本文将深入探讨Java中的数据结构与算法,旨在帮助开发者提升问题解决能力和程序设计技巧。 首先,我们来看数据...

    Java数据结构和算法-带书签目录扫描版

    《Java数据结构和算法-带书签目录扫描版》是一本深入探讨Java编程语言中数据结构和算法的书籍。此扫描版特别包含了完整的书签目录,使得读者在电子版阅读时能够快速定位到所需章节,提高了学习和查阅的效率。 在...

Global site tag (gtag.js) - Google Analytics