package com.lic.linkedList;
public class MyLinkedList<E> {
private class Node {
Object data; // 该节点存放的数据
Node prev; // 该节点的上一个节点地址
Node next; // 该节点的下一个节点地址
}
// 该集合中存储节点的数量
private int size;
// 该集合中第一个节点
private Node first;
// 该集合中最后一个节点
private Node last;
public void add(Object object) {
Node node = new Node();
node.data = object;
if (first == null) {
// 如果添加的是第一节点,则将node赋给first;
first = node;
} else {
// 将新加入节点的next设置为last节点(last节点为此时链表末端节点元素)
node.prev = last;
// 将last(最后一个接单)节点的下一个节点设置为新加入节点node; 因为每个节点是添加到链表的末端
last.next = node;
}
// 将新加入的节点设置为last
last = node;
// 链表长度加1;
size++;
}
public void add(int index, Object object) {
//1.下标越界检测
checkElementIndex(index);
//2.如果是在最后添加节点,则调用add()方法即可
if(index ==size){
add(object);
}
// 创建新的节点
Node newNode = new Node();
// 封装数据
newNode.data = object;
// 获取目标节点
Node oldNode = getNode(index);
// 获取目标节点的前一个节点
Node prev = oldNode.prev;
// 修改新节点与目标位置旧节点的关系
newNode.next = oldNode;
oldNode.prev = newNode;
//修改新节点与目标位置之前节点的关系
if (prev != null) {
prev.next = newNode;
newNode.prev = prev;
} else {
first = newNode; //如果是在第0位置添加节点,则只需要将first重新赋值即可
}
size++;
}
public int size() {
return size;
}
public Object get(int index) {
// 下标越界检测
checkElementIndex(index);
return getNode(index).data;
}
public void remove(int index) {
checkElementIndex(index);
// 获取到需要删除的节点
Node node = getNode(index);
Node oldPrev = node.prev;
Node oldNext = node.next;
// 修改删除节点的前后节点
// 目标节点的前节点的下一个节点由本来的目标节点改为目标节点的下一个节点
if (oldPrev != null) {
oldPrev.next = oldNext;
node.prev = null; // node.prev中存储的是下一个节点对象的地址,置为空之后不影响oldPrev;
} else {
first = oldNext; // 如果删除的是第一个节点,则需要修改first节点值
}
// 目标节点的后节点的上一个节点由本来的目标节点改为目标节点的前一个节点
if (oldNext != null) {
oldNext.prev = oldPrev;
node.next = null;
} else {
last = oldPrev; // 如果删除的是最后一个节点,则需要修改last节点值
}
node.data = null;
size--;
}
private Node getNode(int index) {
Node node = null;
// 从first开始查询
node = first;
if (index < size >> 1) {
for (int i = 0; i < index; i++) {
node = node.next;
}
return node;
}
Node nodeFromLast = last;
for (int i = size - 1; i > index; i--) {
nodeFromLast = nodeFromLast.prev;
}
return nodeFromLast;
}
private void checkElementIndex(int index) {
if (!isElementIndex(index))
throw new IndexOutOfBoundsException("下标越界!!");
}
private boolean isElementIndex(int index) {
return index >= 0 && index < size;
}
}
测试类:
package com.lic.linkedList;
public class Test_LinkedList {
public static void main(String[] args) {
MyLinkedList<String> list = new MyLinkedList<>();
list.add("0");
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("6");
list.add("7");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
list.add(0,"11");
System.out.println("----------------");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}