您的位置:首页 > 其它

自定义集合双向链表

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还是很强大的一门编程语言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: