实现一个带有傀儡节点的双向链表
class DLinkedNode{
public int val;
public DLinkedNode left = null;
public DLinkedNode right = null;
public DLinkedNode(int val) {
this.val = val;
}
}
public class DLinkedList {
private DLinkedNode head = null;
public DLinkedList() {
//构造方法,创建傀儡节点
this.head = new DLinkedNode(-1);
//带环
head.left = head;
head.right = head;
}
//头插
public void addFirst(int val) {
DLinkedNode node = new DLinkedNode(val);
DLinkedNode right = head.right;
node.right = right;
right.left = node;
head.right = node;
node.left = head;
}
//尾插
public void addLast(int val) {
DLinkedNode node = new DLinkedNode(val);
DLinkedNode left = head.left;
node.right = head;
head.left = node;
left.right = node;
node.left = left;
}
//指定位置插入元素
public void addIndex(int index,int val) {
int size = getSize();
if (index < 0 || index > size) {
return;
}
if (index == 0) {
addFirst(val);
return;
}
if (index == size) {
addLast(val);
return;
}
DLinkedNode right = getPos(index);
if (right == null) {
return;
}
DLinkedNode left = right.left;
DLinkedNode newNode = new DLinkedNode(val);
left.right = newNode;
newNode.left = left;
right.left = newNode;
newNode.right = right;
}
//找到下标为index的节点
public DLinkedNode getPos(int index) {
int size = getSize();
if (index < 0 || index > size) {
return null;
}
DLinkedNode node = head.right;
for (int i = 0; i < index; i++) {
node = node.right;
}
return node;
}
//得到链表的实际长度
public int getSize() {
int size = 0;
for (DLinkedNode tmp = head.right;tmp != head;tmp = tmp.right) {
size++;
}
return size;
}
//查看是否包含某个元素
public boolean contains(int key) {
DLinkedNode node = head.right;
for (;node!=head;node = node.right) {
if (node.val == key) {
return true;
}
}
return false;
}
//删除第一次出现的某个元素
public void delete(int val) {
//找到该元素第一次出现的位置
}
//删除所有链表中的该元素
public void deleteAll(int val) {
while (true) {
DLinkedNode toDelete = find(val);
if (toDelete == null) {
break;
}
DLinkedNode left = toDelete.left;
DLinkedNode right = toDelete.right;
left.right = right;
right.left = left;
}
}
public DLinkedNode find(int val) {
DLinkedNode node = head;
for (; node != head; node = node.right) {
if (node.val == val) {
return node;
}
}
return null;
}
public void display() {
//正向输出
for (DLinkedNode node = head.right;
node!=head;node = node.right) {
System.out.print(node.val+" ");
}
System.out.println();
//逆向输出
for (DLinkedNode node = head.left;
node!=head;node = node.left) {
System.out.print(node.val+" ");
}
}
//清空链表
public void clear() {
head.right = head;
head.left = head;
}
}