java代码
package com.xhz.linkedlist;
/**
* 纯手写LinkedList
*
* @author xhz
*
* @param <E>
*/
public class ExtLinkedList<E> {
// 链表实际存储元素
private int size;
// 第一个元素(头节点,为了查询开始)
private Node first;
// 最后一个元素(头节点,为了添加开始)
private Node last;
// 添加元素
public void add(E e) {
// 创建节点
Node node = new Node();
// 给节点赋值
node.object = e;
if (first == null) {
// 添加第一个元素
// 给第一个元素赋值node节点赋值
first = node;
// 第一个元素头和尾都属于自己
} else {
// 添加第二个或以上数据
node.prev = last;
// 将上一个元素的next赋值
last.next = node;
}
last = node;
// 实际长度++
size++;
}
// 按照指定索引插入元素
public void add(int index, E e) {
// 下标的验证
checkElementIndex(index);
// node2节点
ExtLinkedList<E>.Node oldNode = getNode(index);
if (oldNode != null) {
// node1
ExtLinkedList<E>.Node oldPrevNode = oldNode.prev;
// 新增node节点
// node4
Node newNode = new Node();
newNode.object = e;
// node4下一个节点为node2
newNode.next = oldNode;
if (oldPrevNode == null) {
first = newNode;
} else {
// node4上一个节点为node1
newNode.prev = oldPrevNode;
// node1下一个节点为node4
oldPrevNode.next = newNode;
}
// node2的上一个节点为node4
oldNode.prev = newNode;
size++;
}
}
// 链表节点存储元素
private class Node {
// 存放元素的值
Object object;
// 上一个节点Node
Node prev;
// 下一个节点Node
Node next;
}
// 按照下标查询
public Object get(int index) {
// 下标的验证
checkElementIndex(index);
return getNode(index).object;
}
// 按照下标获得节点
public Node getNode(int index) {
// 下标的验证
checkElementIndex(index);
Node node = null;
if (first != null) {
node = first;// 默认取第0个
for (int i = 0; i < index; i++) {
node = node.next;
}
}
return node;
}
// 按照指定下标删除
public void remove(int index) {
checkElementIndex(index);
// 1.先获取当前删除node节点
ExtLinkedList<E>.Node oldNode = getNode(index);
if (oldNode != null) {
// 2.获取删除元素的上下节点
// node3
ExtLinkedList<E>.Node oldNextNode = oldNode.next;
// node1
ExtLinkedList<E>.Node oldPrevNode = oldNode.prev;
// 将node1的下一个节点变为node3
if (oldPrevNode == null) {
// 删除第一个元素从新换头
first = oldNextNode;
} else {
oldPrevNode.next = oldNextNode;
oldNode.prev = null;
}
// 将node3的上一个节点变为node1
if (oldNextNode == null) {
last = oldPrevNode;
} else {
oldNextNode.prev = oldPrevNode;
oldNode.next = null;
}
oldNode.object = null;
// 让垃圾回收机制回收
size--;
}
}
// 检查下标是否越界
public void checkElementIndex(int index) {
if (!isElementIndex(index)) {
throw new IndexOutOfBoundsException("查询越界啦!");
}
}
private boolean isElementIndex(int index) {
return index >= 0 & index < size;
}
// 大小
public int size() {
return size;
}
public static void main(String[] args) {
ExtLinkedList<String> extLinkedList = new ExtLinkedList<String>();
extLinkedList.add("a");
extLinkedList.add("b");
extLinkedList.add("c");
extLinkedList.add("d");
System.out.println("########################################");
System.out.println(extLinkedList.first.object);
System.out.println(extLinkedList.first.next.object);
System.out.println(extLinkedList.first.next.next.object);
System.out.println(extLinkedList.first.next.next.next.object);
System.out.println("########################################");
// 其实从头查到尾,效率不高,查询算法:折半查找(二分法)
for (int i = 0; i < extLinkedList.size; i++) {
System.out.println(extLinkedList.get(i));
}
System.out.println("长度:" + extLinkedList.size());
System.out.println("########################################");
extLinkedList.add(3, "小盒子");
for (int i = 0; i < extLinkedList.size; i++) {
System.out.println(extLinkedList.get(i));
}
System.out.println("########################################");
System.out.println("删除之前:" + extLinkedList.get(2));
extLinkedList.remove(2);
System.out.println("删除之后:" + extLinkedList.get(2));
System.out.println("########################################");
}
}
控制台打印结果:
########################################
a
b
c
d
########################################
a
b
c
d
长度:4
########################################
a
b
c
小盒子
d
########################################
删除之前:c
删除之后:小盒子
########################################