分析:
双向链表的图如下所示:
- 首先我们定义一个变量 cur 去遍历数组,当 cur.data = key的时候,我们就要分情况讨论了
- 我们先判断cur是不是头节点,如果是则执行相应的操作删掉Key
- 如果不是头节点,那么cur就只能是中间结点或者尾结点了。具体的代码实现如下:
public void remove(int key){
ListNode cur = this.head;
while(cur != null) {
if(cur.data == key) {
//判断是否是头节点
if(cur == this.head) {
this.head = this.head.next;
this.head.prev = null;
}else {
//中间和尾巴
cur.prev.next = cur.next;
if(cur.next != null) {
cur.next.prev = cur.prev;
}else {
this.last = cur.prev;
}
}
return;
}
cur = cur.next;
}
}
测试及结果:
public class TestDemo {
public static void main(String[] args) {
DoubleList doubleList = new DoubleList();
doubleList.addFirst(2);
doubleList.addFirst(1);
doubleList.addLast(3);
doubleList.addLast(4);
doubleList.addLast(5);
doubleList.display();
System.out.println();
System.out.println("**********************");
doubleList.remove(3);
doubleList.display();
}
}
注意:一个链表中值为Key的结点并不一定只有一个在这里我们已经知道了如何删除双向链表中第一个值为Key的结点,那我们很容易可以知道如何删除链表中所有值为Key的结点,这里我们只需要让cur 遍历完整个数组,找到所有值为Key的结点并删除就可以了,所以这里我们只需要将上面代码循环里的return删掉就可以了