数据结构之双向链表(JAVA实现)
来源:互联网 发布:steam mac版怎么安装 编辑:程序博客网 时间:2024/05/22 02:46
欢迎转载,请附出处:
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用的是引用,这里的区别希望大家注意一下。
0 0
- 数据结构之双向链表(JAVA实现)
- java 实现双向链表(数据结构)
- 数据结构--双向链表实现(java)
- 数据结构之双向链表的Java实现
- 数据结构学习笔记之用Java实现双向链表
- 数据结构之循环双向链表java实现
- 数据结构之双向链表的实现
- 数据结构之双向链表实现
- 动手实现 数据结构 之 “双向链表”
- 使用java实现双向链表数据结构
- 数据结构--java实现双向链表
- 数据结构之双向循环链表(C++实现)
- 数据结构之双向链表(C语言实现)
- Java 数据结构之双向链表
- Java数据结构之双向链表
- 数据结构——双向链表(Java实现)
- Java数据结构(四):线性表之双向链表
- 数据结构之双向链表(java版)
- 静态网页
- Python pygraphviz 安装方法
- 编译型语言/解释型语言
- C标签定义变量,做加减乘除操作
- EHCache概念,配置文件,使用示例
- 数据结构之双向链表(JAVA实现)
- 开发一款C语言小游戏——骑士飞行棋
- 树莓派摄像头视频直播技术汇总
- 搜索二叉树
- HDU3400(三分)
- C++关于引用问题
- 数据结构和算法学习笔记-2
- 把握linux内核设计思想(三):下半部机制之软中断
- #define的一些使用方法