由于太无聊,所以又写了个双向链表
package list;
/**
* @author xuning
* @date 2020/12/21
*/
public class MyLinkedList<E> {
private ListNode<E> head = null;
private ListNode<E> tail = null;
private int size = 0;
public MyLinkedList() {
this.head = new ListNode<>();
this.tail = head;
}
public MyLinkedList(E[] data) {
this.head = new ListNode<>();
this.tail = head;
addElements(data);
}
public void addElements(E[] data) {
ListNode<E> first = new ListNode<>(data[0]);
this.size++;
ListNode<E> temp = first;
for (int i = 1; i < data.length; i++) {
temp.next = new ListNode(data[i]);
temp.next.pre = temp;
this.size++;
temp = temp.next;
}
if (this.head != this.tail) {
this.tail.next = first;
first.pre = this.tail;
} else {
this.head.next = first;
first.pre = this.head;
}
this.tail = temp;
}
/**
* 尾部添加结点
*
* @param value
*/
public void addLast(E value) {
ListNode<E> listNode = new ListNode(value);
this.size++;
if (this.head != this.tail) {
this.tail.next = listNode;
listNode.pre = this.tail;
this.tail = listNode;
} else {
this.head.next = this.tail = listNode;
listNode.pre = this.head;
}
}
/**
* 首部添加结点
*
* @param value
*/
public void addFirst(E value) {
ListNode<E> listNode = new ListNode<>(value);
this.size++;
if (this.head != this.tail) {
listNode.next = this.head.next;
listNode.next.pre = listNode;
listNode.pre = this.head;
this.head.next = listNode;
} else {
this.head.next = listNode;
this.head.next.pre = this.head;
}
}
public ListNode<E> getHead() {
return this.head.next;
}
public ListNode<E> getTail() {
return this.tail;
}
public E getFist() {
return (E) this.head.next.val;
}
public E getLast() {
return (E) this.tail.val;
}
public void removeFirst() {
ListNode<E> temp = this.head.next;
if (temp != null) {
ListNode<E> next = temp.next;
if (next != null) {
this.head.next = next;
this.head.next.pre = this.head;
temp.val = null;
temp.pre = null;
temp.next = null;
temp = null;
} else {
this.head.next = null;
this.tail = null;
}
this.size--;
}
System.gc();
}
public void removeLast() {
ListNode<E> temp = this.tail;
this.tail = this.tail.pre;
this.tail.next = null;
this.size--;
temp.val = null;
temp.pre = null;
temp.next = null;
temp = null;
System.gc();
}
public int size() {
return this.size;
}
public boolean isEmpty() {
return this.size == 0;
}
public void push(E e) {
this.addLast(e);
}
public void pop() {
this.removeLast();
}
public E peek() {
return this.getLast();
}
public void enQueue(E e) {
this.addLast(e);
}
public E deQueue() {
E fist = this.getFist();
this.removeFirst();
return fist;
}
public E get(int index) throws IndexOutOfBoundsException {
if (index < 0 || index >= this.size) {
throw new IndexOutOfBoundsException("越界");
}
ListNode<E> temp = this.head;
for (int i = 0; i <= index; i++) {
temp = temp.next;
}
return temp.val;
}
public Object[] getElements() {
Object[] elements = new Object[this.size];
int index = 0;
ListNode<E> temp = head.next;
while (temp != null) {
elements[index++] = temp.val;
temp = temp.next;
}
return elements;
}
}