天天看點

不帶頭雙向連結清單删除指定元素

不帶頭雙向連結清單删除指定元素

1、remove(key)

對于remove(key),隻需要删除第一次找到的元素,然後傳回即可。

要删除指定元素,先要判斷連結清單是否為空,如果連結清單為空,就不存在删除指定元素;如果不為空,接下來再判斷要删除的元素是否是其頭部。如果是其頭部,将其頭部後移,并将頭的prev置為null;結構圖如下:

不帶頭雙向連結清單删除指定元素

如果不是頭部,再向後找指定元素,如果要删除的結點是中間結點,結構圖如下:

不帶頭雙向連結清單删除指定元素

如果删除的是尾節點,又是另外一種情況

不帶頭雙向連結清單删除指定元素

在上面的這三種情況中,删除頭節點和尾節點需要特殊考慮一下

程式如下:

public int remove(int key) throws InterruptedException {
        if (this.head==null){
            return -1;
        }
        Node cur=this.head;
        int oldData=0;
        while(cur!=null){
            if (cur.data==key){
                if (cur==this.head){
                    //說明删除的是頭結點
                    oldData=this.head.data;//記錄要删除的值
                    head=head.next;//将頭結點後移
                    head.prev=null;//前驅置為null
                }else {
                    //說明删除的不是頭結點
                    cur.prev.next = cur.next;
                    if (cur.next !=null) {
                        //說明删除的不是尾結點
                        cur.next.prev =cur.prev;
                    } else {
                        //說明删除的是尾結點
                        this.last = cur.prev;
                    }
                    oldData=cur.data;
                }
                return oldData;
            }
            cur=cur.next;
        }
        return -1;
    }
           

測試:

public class TestDouble {
    public static void main(String[] args) throws InterruptedException {
        DoubleLinkedListImpl doubleLinkedList=new DoubleLinkedListImpl();
        doubleLinkedList.addFirst(1);
        doubleLinkedList.addFirst(2);
        doubleLinkedList.addFirst(3);
        doubleLinkedList.addFirst(4);
        doubleLinkedList.addLast(1);
        doubleLinkedList.addLast(2);
        doubleLinkedList.addLast(1);
        doubleLinkedList.addLast(4);
        doubleLinkedList.display();
        doubleLinkedList.remove(1);
        doubleLinkedList.display();
           }
}
           

結果:

不帶頭雙向連結清單删除指定元素

在這個删除指定元素的程式中,裡面的頭插元素需要自己寫,display()列印所有元素的方法也需要自己寫

繼續閱讀