1.双向链表LinkedList的特点
查询,更改较慢,新增和删除较快。
2.代码模拟
public class MyLinkedList {
private Node first;
private Node last;
private int size;
class Node {
Node prev;
Node next;
Object ele;
Node(Object ele) {
this.ele = ele;
}
}
// 添加头元素
public void addFirst(Object ele) {
Node node = new Node(ele);
if (size == 0) {
this.first = node;
this.last = node;
} else {
this.first.prev = node;
node.next = this.first;
this.first = node;
}
size++;
}
// 添加尾元素
public void addLast(Object ele) {
Node node = new Node(ele);
if (size == 0) {
this.first = node;
this.last = node;
} else {
this.last.next = node;
node.prev = this.last;
this.last = node;
}
size++;
}
//删除指定内容的元素,注意:元素个数至少2个以上,否则移除头尾元素会空指针异常
public void remove(Object ele) {
Node current = this.first;
for (int i = 0; i < size; i++) {
if (!ele.equals(current.ele)) {
if (current.next == null) {
return;
}
current = current.next;
}
}
if (current == this.first) {
this.first = current.next;
this.first.prev = null;
} else if (current == this.last) {
this.last = current.prev;
this.last.next = null;
} else {
current.prev.next = current.next;
current.next.prev = current.prev;
}
size--;
}
// 获取元素的个数
public int size() {
return size;
}
// 打印链表中的元素
public String toString() {
Node current = this.first;
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(current.ele);
if (i != (size - 1)) {
sb.append(",");
}
current = current.next;
}
sb.append("]");
return sb.toString();
}
}