双向链表:
优势:
可以向前或者向后查找
可以自我删除
实现思路:
节点需要有一个next域和一个pre域分别指向后一个节点和前一个节点
代码如下:
两个指针分别指向前后节点
int data;
String name;
DoubleList next;
DoubleList pre;
DoubleList head;
因为节点指针变成了两个,所以在添加节点的时候要同时调整pre和next
插入指定元素后面
public void add(int data, String name, String name1) {
DoubleList temp = head;
while (temp != null) {
if (temp.name.equals(name1)) {
DoubleList node = new DoubleList(data, name);
node.next = temp.next;
temp.next.pre = node;
temp.next = node;
node.pre = temp;
return;
}
temp = temp.next;
}
System.out.println("没找到符合条件的位置");
}
插入链表尾部?(我也不知道是不是尾部,反正是远离head的一端)
public void add_e(int data, String name) {
DoubleList temp = head;
DoubleList node = new DoubleList(data,name);
while (temp.next != null) {
temp = temp.next;
}
temp.next = node;
node.pre = temp;
}
delete因为有pre的存在变得简单了,可以实现自我删除^^
public void delete(String name) {
DoubleList temp = head;
while (temp != null) {
if (temp.name == name) {
temp.pre.next = temp.next;
break;
}
temp = temp.next;
}
System.out.println("没找到符合条件的元素");
}
正向打印几乎没有变化但反向打印变得简单了
public void check() {
DoubleList temp = head.next;
while (temp != null) {
System.out.println(temp.data + " " + temp.name);
temp = temp.next;
}
}
public void checkReverse() {
DoubleList temp = head;
while (temp.next != null) {
temp = temp.next;
}
while (temp != head) {
System.out.println(temp.data + " " + temp.name);
temp = temp.pre;
}
}
总结:
双向链表在插入时变得复杂,但简化了删除和反向操作的步骤,感觉在链表足够长的情况下可以使用来进行程序优化.