`

linkedlist - java 简单实现

阅读更多

 

linked list

 

链表,

 

------

特点:

 

linkedlist 相对于基于数组的 list:

* 在中间 插入 & 删除 时,效率较高,只影响 前结点的next指针 和 后结点的pre指针,

* 根据 index get() 时 效率较低,需要一个个查找

 

------

结构:

 

每个元素包含:

* value 值,

* pre 前一个元素,

* next 后1个元素,

 

------

操作:

 

* search

O(n)

* insert

O(1)

* delete

O(1)

* Sentinels

用 一个 特殊值 表示不存在的值,以方便各种操作对空元素的判断,


------

例子 (java 实现):

 

* java 类

 

package eric.algrathem.struct.linkedlist;

import java.util.ArrayList;
import java.util.List;

/**
 * structure for linkedlist
 * 
 * @author eric
 * @date 2011-2-11 上午03:27:26
 */
public class LinkedListStruct<E> {
	/** the header entry */
	private Entry<E> header;
	/** total entry count */
	private int size;

	public LinkedListStruct() {
		this.header = new Entry<E>(null, null, null);
		this.size = 0;
	}

	/**
	 * add at end
	 * 
	 * @param ele
	 */
	public boolean add(E ele) {
		if (size == 0) {
			header.element = ele;
			size++;
		} else {
			addAtEnd(ele);
		}
		return true;
	}

	/**
	 * add at specify position
	 * 
	 * @param ele
	 * @param index target index,index <= current size
	 * @return
	 */
	public boolean add(E ele, int index) {
		if (index < 0 || index > size) { // index invalid
			throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
		} else if (index == size) { // append at end
			return add(ele);
		} else { // add at position of one current element
			addBefore(ele, getEntry(index));
		}
		return true;
	}

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

	public void remove(int index) {
		remove(getEntry(index));
	}

	/** return size */
	public int size() {
		return size;
	}

	/**
	 * search,return first match element's index,if not found return -1
	 * 
	 * @param ele
	 * @return
	 */
	public int search(E ele) {
		return search(ele, 0);
	}

	/**
	 * search,search from specified index,return first match element's index,if not found return -1
	 * 
	 * @param ele
	 * @param start
	 * @return
	 */
	public int search(E ele, int start) {
		Entry<E> entry = getEntry(start);
		int index = start;
		while (index < size) {
			if (entry.element != null && entry.element.equals(ele)) {
				return index;
			}
			entry = entry.next;
			index++;
		}
		return -1;
	}

	/**
	 * search all,return all match element's index in a list
	 * 
	 * @param ele
	 * @return
	 */
	public List<Integer> searchAll(E ele) {
		return searchAll(ele, 0);
	}

	/**
	 * search all,search from specified index,return all match element's index in a list
	 * 
	 * @param ele
	 * @param start
	 * @return
	 */
	public List<Integer> searchAll(E ele, int start) {
		List<Integer> result = new ArrayList<Integer>();
		Entry<E> entry = getEntry(start);
		int index = start;
		while (index < size) {
			if (entry.element != null && entry.element.equals(ele)) {
				result.add(index);
			}
			entry = entry.next;
			index++;
		}
		return result;
	}

	/** single data entity,including data & two reference(previous,next) */
	private static class Entry<E> {
		E element;
		Entry<E> next;
		Entry<E> previous;

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

	/**
	 * insert before
	 * 
	 * @param ele
	 * @param entry
	 * @return
	 */
	private synchronized Entry<E> addBefore(E ele, Entry<E> entry) {
		Entry<E> newEntry = new Entry<E>(ele, entry, entry.previous);
		if (entry.previous != null) {
			entry.previous.next = newEntry;
		}
		entry.previous = newEntry;
		if (newEntry.previous == null) { // reset header
			header = newEntry;
		}
		size++;
		return newEntry;
	}

	/**
	 * add at end
	 * 
	 * @param ele
	 * @return
	 */
	private synchronized Entry<E> addAtEnd(E ele) {
		Entry<E> end = getEntry(size - 1);
		Entry<E> newEntry = new Entry<E>(ele, null, end);
		end.next = newEntry;
		size++;
		return newEntry;
	}

	/**
	 * get by index,index is the order of entry (start by 0)
	 * 
	 * @param index
	 * @return
	 */
	private synchronized Entry<E> getEntry(int index) {
		if (index < 0 || index >= size) {
			throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
		}
		Entry<E> entry = header;
		while (index-- > 0) {
			entry = entry.next;
		}
		return entry;
	}

	/**
	 * insert before
	 * 
	 * @param ele
	 * @param entry
	 * @return
	 */
	private synchronized void remove(Entry<E> entry) {
		if (entry.previous != null) {
			entry.previous.next = entry.next;
		} else { // header is the target to remove,reset header
			header = (entry.next == null ? new Entry<E>(null, null, null) : entry.next);
		}
		if (entry.next != null) {
			entry.next.previous = entry.previous;
		}
		entry.previous = entry.next = null;
		entry = null;
		size--;
	}
}
 

 

junit 测试类

 

package eric.algrathem.struct.linkedlist;

import java.util.List;

import junit.framework.Assert;
import junit.framework.TestCase;

import org.junit.Test;

/**
 * test case for LinkedListStruct
 * 
 * @author eric
 * @date 2011-2-11 下午08:50:35
 */
public class LinkedListStructTest extends TestCase {
	@Test
	public void testAdd() {
		LinkedListStruct<Integer> list = new LinkedListStruct<Integer>();
		int size = 10;
		for (int i = 0; i < size; i++) {
			list.add(i);
		}

		for (int i = 0; i < size; i++) {
			Assert.assertTrue(i == list.get(i));
		}

		list.add(100, 5);
		Assert.assertTrue(100 == list.get(5));
		Assert.assertTrue(4 == list.get(4));
		Assert.assertTrue(5 == list.get(6));
		Assert.assertTrue(6 == list.get(7));
	}

	@Test
	public void testRemove() {
		LinkedListStruct<Integer> list = new LinkedListStruct<Integer>();
		int size = 20;
		int[] removeIndexArr = { 3, 8, 15 };
		for (int i = 0; i < size; i++) {
			list.add(i);
		}
		for (int i = 0; i < removeIndexArr.length; i++) {
			list.remove(removeIndexArr[i] - i);
		}

		Assert.assertTrue(list.size() == size - removeIndexArr.length);
		int curRemove = 0;
		int fix = 0;
		for (int i = 0; i < list.size(); i++) {
			if (curRemove < removeIndexArr.length && i == (removeIndexArr[curRemove] - curRemove)) {
				fix++;
				curRemove++;
			}
			Assert.assertTrue(list.get(i) == i + fix);
		}
	}

	@Test
	public void testSearch() {
		LinkedListStruct<Integer> list = new LinkedListStruct<Integer>();
		int size = 10;
		int repeat = 3;
		for (int i = 0; i < repeat; i++) {
			for (int j = 0; j < size; j++) {
				list.add(j);
			}
		}
		for (int x = 0; x < size; x++) {
			Assert.assertEquals(x, list.search(x));
			for (int y = 0; y < repeat; y++) {
				Assert.assertEquals(x + size * y, list.search(x, size * y));
			}
		}
	}

	@Test
	public void testSearchAll() {
		LinkedListStruct<Integer> list = new LinkedListStruct<Integer>();
		int size = 10;
		int repeat = 3;
		for (int i = 0; i < repeat; i++) {
			for (int j = 0; j < size; j++) {
				list.add(j);
			}
		}
		for (int x = 0; x < size; x++) {
			// searchAll(ele)
			List<Integer> result = list.searchAll(x);
			Assert.assertEquals(result.size(), repeat);
			for (int y = 0; y < repeat; y++) {
				Assert.assertTrue(result.get(y) == x + y * size);
			}

			// searchAll(ele,start)
			for (int z = 0; z < repeat; z++) {
				List<Integer> resultPart = list.searchAll(x, z * size);
				Assert.assertEquals(resultPart.size(), repeat - z);
				for (int z1 = 0; z1 < resultPart.size(); z1++) {
					Assert.assertTrue(resultPart.get(z1) == ((z + z1) * size) + x);
				}
			}
		}
	}
}

 
------

 

分享到:
评论

相关推荐

    数据结构-Java中实现一个简单的链表结构

    数据结构-Java中实现一个简单的链表结构,通过定义一个节点类(Node),然后定义一个链表类(LinkedList)来管理节点,简单易懂,适合初学数据结构的同学掌握基本数据结构的使用实现原理。

    advanced-java-master.zip

    - 集合框架:如ArrayList、LinkedList、HashMap等,是数据存储和处理的关键。 - 异常处理:学习如何正确使用try-catch-finally语句,以及自定义异常。 2. **多线程** - 线程的创建:通过Thread类或实现Runnable...

    聊天室------java编写----多人聊天

    这个项目可能是一个简单的实现,旨在帮助学习者理解如何构建一个基础的网络通信系统,特别是涉及到多人实时交流的部分。 描述中提到,“用java编写的聊天室,简单实用”,这暗示了该项目使用Java的核心特性,如面向...

    全国计算机等级考试-二级教程-Java语言程序设计(2008年版)

    10. **Swing GUI**:简单介绍Java的图形用户界面编程,如何使用Swing库创建窗口应用。 11. **JDBC数据库访问**:讲解如何使用Java连接和操作数据库,包括数据库连接、预编译SQL、结果集处理等。 12. **案例分析**...

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

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

    company--java小例子

    初学者可以通过这些小例子了解如何在Java中编写简单的程序。 2. **类与对象**: Java是面向对象的语言,"小例子"可能包含创建类、对象以及封装、继承、多态等面向对象特性。理解类的定义,对象的实例化,以及如何...

    线性表实现源码-java

    总结,"线性表实现源码-java"涉及到Java中对线性表两种常见存储结构——顺序存储(ArrayList)和链式存储(LinkedList)的实现,以及相关的基本操作。这些源码对于学习和理解数据结构及其在Java中的应用具有重要意义...

    Java实验报告--Java的简单介绍

    Java的简单介绍通常会涵盖以下几个核心概念: 1. **语法基础**:Java的语法与C++类似,但更简洁且具有自动内存管理机制,如垃圾回收。基础语法包括变量声明、数据类型(如整型、浮点型、字符型、布尔型等)、运算符...

    JAVA利用LinkedList构造栈与队列

    以下是一个简单的使用LinkedList实现栈的Stack类示例: ```java import java.util.LinkedList; public class Stack { private LinkedList&lt;Object&gt; stack = new LinkedList(); public void push(Object item) { ...

    2022年Java学习笔记-Java课程配套案例.rar

    压缩包中的"Java课程配套案例"可能包含上述部分或全部知识点的实际应用示例,例如,可能会有创建简单控制台应用的案例,用于演示基础语法;或者有处理文件读写的例子,展示I/O操作;也可能包含多线程的实战,比如...

    最新的---java资料

    6. **集合框架**:Java集合框架包括List、Set、Queue和Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类,为存储和操作对象提供了强大的工具。 7. **IO流**:Java的IO库提供了处理输入输出的强大...

    Java实训书资料--- java程序源代码

    5. **集合框架**:Java集合框架包括ArrayList、LinkedList、HashSet、HashMap等,用于存储和操作数据。源码中可能会包含如何使用这些集合类的例子。 6. **输入/输出流**:Java的IO流允许程序读取和写入数据,如...

    java局域网五子棋.rar---java局域网五子棋.rar

    这个项目的重点在于网络通信和游戏逻辑的实现,它结合了Java的基础特性、图形用户界面(GUI)设计以及网络编程技术。下面我们将详细探讨这些关键知识点。 1. **Java基础知识**: - **面向对象编程**:Java是一种...

    Java-Java集合教程

    Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了数据结构和算法的实现,使得在处理对象集合时更加高效和灵活。Java集合教程通常会涵盖以下关键知识点: 1. **集合接口**: - `Collection`:这是...

    链表(数据结构--Java版)

    3. `LinkedListClass.java` - 这个文件很可能是对标准Java的`java.util.LinkedList`类的一个简单实现或者示例,`LinkedList`是Java集合框架的一部分,实现了`List`、`Deque`和`Cloneable`接口。它使用双向链表来存储...

    Agile Java习题2--Java基础

    这可能是一个实现棋盘游戏逻辑的简单Java程序,用于教授面向对象编程的概念,如类的设计、继承、多态性等。通过分析和改进这个棋盘游戏的代码,学习者可以实践如何在Java中构建复杂系统,理解对象之间的交互,以及...

    LinkedList实现栈

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

    Head-First-Java-source.zip

    《Head First Java》是一本非常受欢迎的Java编程学习书籍,其源码包"Head-First-Java-source.zip"为读者提供了书中示例代码的详细实现,帮助读者更好地理解和实践Java编程。这个压缩包包含了两部分资源:一本是...

    IBM-ETP-java培训01.Java 简介.ppt

    8. **集合框架**:ArrayList、LinkedList、HashSet、HashMap等数据结构的使用,以及接口和实现类之间的关系。 9. **包装类**:Integer、Double等八大基本类型的包装类,以及它们与原始类型之间的转换。 10. **多...

    简易java订销管理系统-javainfo

    《简易Java订销管理系统-javainfo》是一个面向学习者和初学者的开源项目,旨在帮助大家理解并实践Java编程在实际业务中的应用。这个系统提供了全量功能的源码,使得用户能够深入探究每个功能的实现细节,同时也配备...

Global site tag (gtag.js) - Google Analytics