数据结构之双向链表(JAVA实现)
2015-07-28 23:25
375 查看
欢迎转载,请附出处:
http://blog.csdn.net/as02446418/article/details/47114711
最近重新复习了一些基础的数据结构,发觉自己好多已经淡忘了,索性重新捡起来以前的知识,今天笔者回顾了一下链表的知识,用JAVA实现了一个双向链表,下面来看代码:
测试类:
Java实现的链表和c/c++有点不一样的地方是c/c++用的是指针,而Java用的是引用,这里的区别希望大家注意一下。
http://blog.csdn.net/as02446418/article/details/47114711
最近重新复习了一些基础的数据结构,发觉自己好多已经淡忘了,索性重新捡起来以前的知识,今天笔者回顾了一下链表的知识,用JAVA实现了一个双向链表,下面来看代码:
public class DoubleLinkedList { // 节点类Node private static class Node { Object value; Node prev = this; Node next = this; Node(Object v) { value = v; } public String toString() { return value.toString(); } } private Node head = new Node(null); // 头节点 private int size; // 链表大小 // 以下是接口方法 //添加到链表表头 public boolean addFirst(Object o) { addAfter(new Node(o), head); return true; } //将元素添加到链表表尾 public boolean addLast(Object o) { addBefore(new Node(o), head); return true; } public boolean add(Object o) { return addLast(o); } //将元素添加到指定位置 public boolean add(int index, Object o) { addBefore(new Node(o), getNode(index)); return true; } //移除指定位置 public boolean remove(int index) { removeNode(getNode(index)); return true; } //移除链表表头元素 public boolean removeFirst() { removeNode(head.next); return true; } //移除链表表尾元素 public boolean removeLast() { removeNode(head.prev); return true; } //取到指定位置的元素值 public Object get(int index) { return getNode(index).value; } //返回链表的大小 public int size() { return size; } public String toString() { StringBuffer s = new StringBuffer("["); Node node = head; for (int i = 0; i < size; i++) { node = node.next; if (i > 0) s.append(", "); s.append(node.value); } s.append("]"); return s.toString(); } //以下是实现方法 //查找链表元素 private Node getNode(int index) { if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); Node node = head.next; for (int i = 0; i < index; i++) node = node.next; return node; } //在某元素之前添加元素 private void addBefore(Node newNode, Node node) { newNode.prev = node.prev; newNode.next = node; newNode.next.prev = newNode; newNode.prev.next = newNode; size++; } //在某元素之后添加元素 private void addAfter(Node newNode, Node node) { newNode.prev = node; newNode.next = node.next; newNode.next.prev = newNode; newNode.prev.next = newNode; size++; } //移除特定元素 private void removeNode(Node node) { node.next.prev = node.prev; node.prev.next = node.next; node.prev = null; node.next = null; size--; } } //有些地方还可以优化,比如查找时可以判断索引是否大于size的一半,如果是的话,就从另一头开始迭代。
测试类:
public class Test { public static void main(String[] args) { DoubleLinkedList dll = new DoubleLinkedList(); //添加 dll.add("A"); dll.add("B"); dll.add("C"); System.out.println(dll); //添加到最前 dll.addFirst("D"); System.out.println(dll); //添加到最后 dll.addLast("E"); System.out.println(dll); //添加到指定位置 dll.add(4, "F"); System.out.println(dll); //移除最前的 dll.removeFirst(); System.out.println(dll); //移除最后的 dll.removeLast(); System.out.println(dll); //移除指定位置上的 dll.remove(2); System.out.println(dll); //返回指定位置上的元素 System.out.println(dll.get(1)); } }
Java实现的链表和c/c++有点不一样的地方是c/c++用的是指针,而Java用的是引用,这里的区别希望大家注意一下。
相关文章推荐
- android 代码实现控件之间的间距
- [C/C++]反转链表
- [Android]在代码里运行另一个程序的方法
- 肯特·贝克:改变人生的代码整理魔法
- 网页恶意代码的预防
- 高手写的Tracer-Flash代码调试类代码下载
- C#实现基于链表的内存记事本实例
- CSS代码缩写技巧
- 非主流Q-zOne代码代码搜集第1/2页
- CreateWeb.vbs 代码
- Lua中编译执行代码相关的函数详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- 更有效率的css代码编写第1/3页
- 代码中到底应不应当写注释?
- 数据结构之Treap详解
- SQL语言查询基础:连接查询 联合查询 代码
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++实现简单的学生管理系统