- 浏览: 443166 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (158)
- J2SE (15)
- c/c++ (17)
- linux & ubuntu (20)
- js (18)
- algorithm (21)
- android (1)
- software (3)
- svn (1)
- db (6)
- other (19)
- css (5)
- go (1)
- html 5 (3)
- computer science (1)
- php (3)
- 创业 (8)
- EJB & jboss (1)
- TDD (1)
- jsp & servlet (2)
- http, tcp & ip (2)
- hibernate (1)
- json (1)
- 乐 (2)
- ps (2)
- netbeans (1)
- extjs (2)
- eclipse (4)
- 项目管理 (1)
- varnish (2)
- study abroad (1)
- python (1)
- erlang (1)
- math (1)
- shell (1)
- assembly (4)
- lucene (1)
- web (1)
- http (1)
- tcp & ip (1)
最新评论
-
yiguxianyun:
...
css li 不换行 -
stdayong:
...
netbeans 中使用 maven -
程序猿_星:
为啥会中文乱码啊
servlet 以 gzip 格式返回数据 -
huanhuan519:
感谢分享~
gdb 调试工具 -
heyl1234:
写过些js,对css还不熟。谢谢~
css li 不换行
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); } } } } }
------
发表评论
-
c - linkedlist
2012-05-10 14:52 1081c - linkedlist store ordere ... -
c - word counter (binary-tree)
2012-05-09 14:17 1726c - word counter (binary-tree) ... -
random select
2011-08-28 01:00 1205random select problem: ... -
sparse data structure - matrix
2011-08-18 20:03 1083sparse data structure sp ... -
max sub_sequence - c
2011-08-10 01:02 1074max sub_sequence - c /* ... -
binary search - c
2011-08-06 12:07 1092binary search - c (simple) ... -
bit_array - simple use
2011-05-28 23:47 1007bit array,use less memory to de ... -
queue (用 java 简单实现)
2011-02-03 01:45 4048queue ------ 结构 线性存 ... -
Medians and Order Statistics (次序统计)
2011-01-03 14:36 2827Medians and Order Statistics - ... -
counting sort
2011-01-02 20:36 1564counting sort ------ counting ... -
quick sort
2011-01-01 20:26 1190quicksort ------ quicksort ove ... -
priority queue
2010-12-22 00:11 2270priority queue priority queue ... -
heap sort
2010-12-18 19:09 1206heapsort ------ heap 数据结构 hea ... -
merge sort
2010-12-01 23:37 1149merge sort 合并排序 ------ merge ... -
insertion sort
2010-10-28 00:21 1044insertion sort ------ insertio ... -
z 字型 读取 矩阵
2010-10-23 16:50 2190以 z 字型 读取 矩阵, ... -
排序算法:求 长度为 n的 数组中,最大的 m个数
2010-08-31 10:16 2631排序:数组 length=m,从其中中取出最大的 n 数字,n ... -
已排序数组 a,求其元素的绝对值 共有多少个不同的值
2010-08-29 20:41 1603已排序数组 a,求其元素的绝对值 共有多少个不同的值? ... -
binary search
2010-08-29 19:35 972binary search in sorted array: ... -
An Introduction to Algorithm 2nd 's contents
2010-08-11 23:02 1185算法导论(2nd) 结构 * <Introductio ...
相关推荐
数据结构-Java中实现一个简单的链表结构,通过定义一个节点类(Node),然后定义一个链表类(LinkedList)来管理节点,简单易懂,适合初学数据结构的同学掌握基本数据结构的使用实现原理。
- 集合框架:如ArrayList、LinkedList、HashMap等,是数据存储和处理的关键。 - 异常处理:学习如何正确使用try-catch-finally语句,以及自定义异常。 2. **多线程** - 线程的创建:通过Thread类或实现Runnable...
这个项目可能是一个简单的实现,旨在帮助学习者理解如何构建一个基础的网络通信系统,特别是涉及到多人实时交流的部分。 描述中提到,“用java编写的聊天室,简单实用”,这暗示了该项目使用Java的核心特性,如面向...
10. **Swing GUI**:简单介绍Java的图形用户界面编程,如何使用Swing库创建窗口应用。 11. **JDBC数据库访问**:讲解如何使用Java连接和操作数据库,包括数据库连接、预编译SQL、结果集处理等。 12. **案例分析**...
在Java编程语言中,LinkedList集合类是一个非常重要的数据结构,它可以用来实现栈和队列这两种特殊的数据结构。LinkedList是一个双链表,每个节点包含数据元素和两个引用,分别指向前后节点,这使得在列表中进行插入...
初学者可以通过这些小例子了解如何在Java中编写简单的程序。 2. **类与对象**: Java是面向对象的语言,"小例子"可能包含创建类、对象以及封装、继承、多态等面向对象特性。理解类的定义,对象的实例化,以及如何...
总结,"线性表实现源码-java"涉及到Java中对线性表两种常见存储结构——顺序存储(ArrayList)和链式存储(LinkedList)的实现,以及相关的基本操作。这些源码对于学习和理解数据结构及其在Java中的应用具有重要意义...
Java的简单介绍通常会涵盖以下几个核心概念: 1. **语法基础**:Java的语法与C++类似,但更简洁且具有自动内存管理机制,如垃圾回收。基础语法包括变量声明、数据类型(如整型、浮点型、字符型、布尔型等)、运算符...
以下是一个简单的使用LinkedList实现栈的Stack类示例: ```java import java.util.LinkedList; public class Stack { private LinkedList<Object> stack = new LinkedList(); public void push(Object item) { ...
压缩包中的"Java课程配套案例"可能包含上述部分或全部知识点的实际应用示例,例如,可能会有创建简单控制台应用的案例,用于演示基础语法;或者有处理文件读写的例子,展示I/O操作;也可能包含多线程的实战,比如...
6. **集合框架**:Java集合框架包括List、Set、Queue和Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类,为存储和操作对象提供了强大的工具。 7. **IO流**:Java的IO库提供了处理输入输出的强大...
5. **集合框架**:Java集合框架包括ArrayList、LinkedList、HashSet、HashMap等,用于存储和操作数据。源码中可能会包含如何使用这些集合类的例子。 6. **输入/输出流**:Java的IO流允许程序读取和写入数据,如...
这个项目的重点在于网络通信和游戏逻辑的实现,它结合了Java的基础特性、图形用户界面(GUI)设计以及网络编程技术。下面我们将详细探讨这些关键知识点。 1. **Java基础知识**: - **面向对象编程**:Java是一种...
Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了数据结构和算法的实现,使得在处理对象集合时更加高效和灵活。Java集合教程通常会涵盖以下关键知识点: 1. **集合接口**: - `Collection`:这是...
3. `LinkedListClass.java` - 这个文件很可能是对标准Java的`java.util.LinkedList`类的一个简单实现或者示例,`LinkedList`是Java集合框架的一部分,实现了`List`、`Deque`和`Cloneable`接口。它使用双向链表来存储...
这可能是一个实现棋盘游戏逻辑的简单Java程序,用于教授面向对象编程的概念,如类的设计、继承、多态性等。通过分析和改进这个棋盘游戏的代码,学习者可以实践如何在Java中构建复杂系统,理解对象之间的交互,以及...
首先,LinkedList类位于Java的`java.util`包中,它实现了List接口,允许我们存储和操作一系列元素。LinkedList内部维护了一个双向链表,每个元素都是一个Node对象,包含元素值以及指向前后节点的引用。由于...
《Head First Java》是一本非常受欢迎的Java编程学习书籍,其源码包"Head-First-Java-source.zip"为读者提供了书中示例代码的详细实现,帮助读者更好地理解和实践Java编程。这个压缩包包含了两部分资源:一本是...
8. **集合框架**:ArrayList、LinkedList、HashSet、HashMap等数据结构的使用,以及接口和实现类之间的关系。 9. **包装类**:Integer、Double等八大基本类型的包装类,以及它们与原始类型之间的转换。 10. **多...
《简易Java订销管理系统-javainfo》是一个面向学习者和初学者的开源项目,旨在帮助大家理解并实践Java编程在实际业务中的应用。这个系统提供了全量功能的源码,使得用户能够深入探究每个功能的实现细节,同时也配备...