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;
last.next = node;// 上一个元素的next赋值
}
last = node;
size++;
}
// 下标添加
public void add(int index, E e) {
// 下标的验证
checkElementIndex(index);
/*if (index == size) {//
add(e);
}*/
Node oldNode = getNode(index);// 原本下标index的节点 node2
if (oldNode != null) {
//Node oldNextNode = oldNode.next;// nodel3
Node oldPrevNode = oldNode.prev;// node1
Node newNode = new Node();// node4
newNode.object = e;
// node4的下一个节点
newNode.next = oldNode;
if (oldPrevNode == null) {
first = newNode;
} else {
// node4的上一个节点
newNode.prev = oldPrevNode;
// node1的下个节点
oldPrevNode.next = newNode;
}
// node2的下个节点
oldNode.prev = newNode;
}
size++;
}
// get
public Object get(int index) throws Exception {
if (!isElementIndex(index))
throw new IndexOutOfBoundsException("越界了");
Node node = null;
if (first != null) {
node = first;
for (int i = 0; i < index; i++) {
node = node.next;
}
}
return node.object;
}
public void remove(int index) throws Exception {
if (!isElementIndex(index))
throw new IndexOutOfBoundsException("越界了");
ExtLinkedList.Node oldNode = getNode(index);
if (oldNode != null) {
// 获取删除节点的上下节点
// node3
ExtLinkedList.Node nextNode = oldNode.next;
// node1
ExtLinkedList.Node prevNode = oldNode.prev;
if (prevNode != null) {
prevNode.next = nextNode;
oldNode.prev = null;
} else {
first = nextNode;
}
if (nextNode != null) {
nextNode.prev = prevNode;
oldNode.next = null;
} else {
last = prevNode;
}
nextNode.object = null;
size--;
}
/*
* oldNode.prev.next = oldNode.next; oldNode.next.prev = oldNode.prev;
*/
}
// 获取node
public Node getNode(int index) {
if (!isElementIndex(index))
throw new IndexOutOfBoundsException("越界了");
Node node = null;
if (first != null) {
node = first;
for (int i = 0; i < index; i++) {
node = node.next;
}
}
return node;
}
public int getSize() {
return size;
}
// 链表节点存储元素
private static class Node {
Object object;// 当前元素
Node prev;// 上一个元素
Node next;// 写一个元素
}
private void checkElementIndex(int index) {
if (!isElementIndex(index))
throw new IndexOutOfBoundsException("越界");
}
private boolean isElementIndex(int index) {
return index >= 0 && index < size;
}
private String outOfBoundsMsg(int index) {
return "Index: " + index + ", Size: " + size;
}
public static void main(String[] args) throws Exception {
ExtLinkedList extLinkedList = new ExtLinkedList();
extLinkedList.add("a");
extLinkedList.add("b");
extLinkedList.add("c");
extLinkedList.add("e");
System.out.println("前"+extLinkedList.size);
System.out.println(extLinkedList.get(3));
extLinkedList.add(3, "d");
System.out.println("后"+extLinkedList.size);
System.out.println(extLinkedList.get(3));
/*for (int i = 0; i < extLinkedList.size-1; i++) {
Object object = extLinkedList.get(i);
System.out.println(object);
}*/
/*
* for (int i = 0; i < extLinkedList.size; i++) {
* System.out.println("--" + extLinkedList.get(i)); }
*/
}
}
源码分析之手写ExtLinkedList
猜你喜欢
转载自blog.csdn.net/qq_41988225/article/details/84631702
今日推荐
周排行