package com.xuyuedu;
@SuppressWarnings("all")
public class ExtLinkedList<E> {
// 链表实际存储元素
private int size;
// 第一个元素(头节点,为了查询开始)
private Node first;
// 最后一个元素(尾节点,为了添加开始)
private Node last;
// add
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) {
// oldPrevNode:Node1
ExtLinkedList<E>.Node oldPrevNode = oldNode.prev;
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;
}
private boolean isElementIndex(int index) {
return index >= 0 && index < size;
}
private void checkElementIndex(int index) {
if (!isElementIndex(index))
throw new IndexOutOfBoundsException("查询越界了!");
}
public void remove(int index) {
checkElementIndex(index);
// 1.获取当前删除节点:Node2
ExtLinkedList<E>.Node oldNode = getNode(index);
if (oldNode != null) {
// 2.获取删除元素上下节点
// oldNextNode:Node3
ExtLinkedList<E>.Node oldNextNode = oldNode.next;
// oldPrevNode:Node1
ExtLinkedList<E>.Node oldPrevNode = oldNode.prev;
if (oldPrevNode == null) {
// 删除第一个元素,要把下一个元素变为first
first = oldNextNode;
} else {
// 将Node1的下一个节点变为Node3
oldPrevNode.next = oldNextNode;
oldNode.prev=null;
}
if (oldNextNode == null) {
last=oldPrevNode;
}else {
// 将Node3的上一个节点变为Node1
oldNextNode.prev = oldPrevNode;
oldNode.next=null;
}
oldNode.object=null;//让垃圾回收掉
size--;
}
}
public static void main(String[] args) {
ExtLinkedList<String> extLinkedList = new ExtLinkedList<String>();
extLinkedList.add("q");
extLinkedList.add("d");
extLinkedList.add("r");
extLinkedList.add("f");
extLinkedList.add(0, "p");
for(int i=0;i<extLinkedList.size;i++) {
System.out.println(extLinkedList.get(i));
}
}
}
测试结果:
p
q
d
r
f
借鉴:分布式微服务专家:余胜军:qq:644064779