自定义集合双向链表
2015-09-20 22:36
351 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">写博客真心需要毅力,很多时候都是有心无力,因为工作之外的事感觉都干不好,但是只有逼着自己去做才能更加优秀,以下是自定义双向链表的实现。</span>
public class MyLinkedList<E> { // 尾节点 private transient Node<E> last; // 头节点 private transient Node<E> first; // 节点个数 private int size; // 修改次数 private int modCount; // 取出元素 public E get(int index) { return node(index).item; } // 返回对应点节点 Node<E> node(int index) { // 判断当前要取得节点位于链表中哪一部分 if (index < (size >> 2)) { // 取出第一个节点 Node<E> x = first; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node<E> x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; } } // 添加元素 public boolean add(E e) { linkedLast(e); return true; } // 添加元素到尾部 private void linkedLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++; } // 类内部指针 private static class Node<E> { // 当前元素 E item; // 下一个节点 Node<E> next; // 上一个节点 Node<E> prev; // 构造指针节点 public Node(Node<E> prev, E element, Node<E> next) { this.prev = prev; this.next = next; this.item = element; } } // 删除节点 public E remove(int index) { return unlink(node(index)); } // 删除某个节点 E unlink(Node<E> x) { final E element = x.item; final Node<E> next = x.next; final Node<E> prev = x.prev; if (prev == null) { first = next; } else { prev.next = next; x.prev = null; } if (next == null) { last = prev; } else { next.prev = prev; x.next = null; } x.item = null; size--; modCount++; return element; } //修改节点内容 public E set(int index,E element) { //取出当前节点 Node<E> x=node(index); E oldValue=x.item; x.item=element; return oldValue; } }以上是我仿照jdk内置双向链表写的,简单的增删该查,代码还是比较浅显的,主要逻辑就是操纵静态内部类,以此在内存中呈现一种双向链表的数据结构,这种代码总给我一种c风格的感觉,因为java屏蔽掉了指针,所以无法对指针进行运算操纵内存,但是类中构造内部类,就能实现类似逻辑,所以java还是很强大的一门编程语言。
相关文章推荐
- 有限状态机与应用一例
- Python——类属性/实例属性
- 触发器学习笔记
- 微服务架构 如何影响传统的软件架构设计
- 云计算基本概念
- 2016年魅族Java研发面试总结
- Linux与windows的对比
- MySQL 局域网访问速度慢的问题
- iOS小文件的下载方式
- 如何让类似imagePicker以及MVMoview系统控件返回按钮显示中文
- 论文笔记《Superparsing: Scalable Nonparametric Image Parsing with Superpixels》
- 实践一:个人项目实践
- 白盒测试的几种覆盖方式
- 最简单的html+css三列布局
- Android集成友盟社会化分享
- 经典题目
- Cocoa消息处理流程
- 第二次作业(1.个人项目实践
- block & inline
- 黑马程序员——Java之网络通信