天天看點

連結清單資料“暗殺記” | 帶你學《Java面向對象程式設計》之九十四

上一篇:速度了解神奇的索引操作 | 帶你學《Java面向對象程式設計》之九十三

【本節目标】

通過閱讀本節内容,你将掌握連結清單查詢方法contains()與删除方法remove()、清表方法clean()的實作,對單向連結清單的所有基本功能擁有初步的掌握與了解。

判斷指定資料是否存在:public boolean contains(E data)

在一個集合裡面往往會儲存大量的資料,有些時候需要判斷某個資料是否存在,這個時候就可以通過對象比較的模式(equals()方法)來完成判斷。

1、在ILink接口中追加判斷的方法

public boolean contains(E data) ; //判斷資料是否存在           

2、在Node類中進行依次判斷

public boolean containsNode(E data) {
    if (this.data.equals(data)) {    //對象比較
        return true ;
    }else {
       if (this.next == null) {         //沒有後續節點
          return false ;   //找不到
       }else {
          return this.next.containsNode(data) ;   //向後繼續判斷 
       }
    }
}           

3、在LinkImpl子類裡面實作此方法

public boolean contains(E data) {
    if (data == null) {
       return false ;     //沒有資料
    }
    return this.root.containsNode(data) ;    //交給Node類判斷
}           
連結清單資料“暗殺記” | 帶你學《Java面向對象程式設計》之九十四

圖一 執行結果一

由于整個連結清單沒有空資料的存在,是以整體的程式在判斷的時候直接使用每一個的節點資料發出equals()方法調用即可。

資料删除:public void remove(E data)

資料的删除值得是可以從集合裡面删除掉指定的一個資料内容,也就是說此時傳遞的是資料内容,那麼如果要實作這種删除操作依然需要對象比較的支援。但是對于集合資料的删除需要考慮兩種情況:

要删除的是根節點資料:(LinkImpl與根節點有關,是以這個判斷由跟節點完成)

連結清單資料“暗殺記” | 帶你學《Java面向對象程式設計》之九十四

圖二 删除根節點

要删除的不是根節點資料:(由Node類負責)

連結清單資料“暗殺記” | 帶你學《Java面向對象程式設計》之九十四

圖三 删除的不是根節點

1、在ILink接口裡面追加新的删除方法

public void remove(E e) ;        //資料删除           

2、在LinkImpl子類裡面實作根節點的判斷

public void remove(E data) {
    if (this.contains(data)) {     //判斷資料是否存在
        if(this.root.data.equals(data)) {       //根節點為要删除節點
            this.root = this.root.next ;    //根的下一個節點  
        }
        this.count -- ;
     }
}           

3、如果現在根節點并不是要删除的節點,那麼就需要進行後續節點的判斷,但是請一定要記住,此時根節點已經判斷完成,再判斷應該從根節點的下一個開始判斷。在Node類中追加删除處理。

public void removeNode (Node previous,E data) {
     if (this.data.equals(data)) {
        previous.next = this.next ;    //空出目前節點
     }else {
         if (this.next != null) {       //有後續節點
            this.next.removeNode(this, data) ;    //向後繼續删除
         }
     }
}           

4、完善LinkImpl子類中的remove()方法

public void remove(E data) {
     if (this.contains(data)) {     //判斷資料是否存在
         if (this.root.data.equals(data)) {       //根節點為要删除節點
            this.root = this.root.next ;    //根的下一個節點  
         }else {         //交由Node類進行删除
            this.root.next.removeNode(this.root , data) ;
         }
         this.count -- ;
     }
}           
連結清單資料“暗殺記” | 帶你學《Java面向對象程式設計》之九十四
連結清單資料“暗殺記” | 帶你學《Java面向對象程式設計》之九十四

圖四 執行結果二

删除邏輯依靠的就是引用的改變處理完成的。

清空連結清單:public void clean()

有些時候需要進行連結清單資料的整體清空處理,這個時候就可以直接根據根元素來進行控制,隻要root設定為了null,那麼後續的節點就都不存在了。

1、在ILink接口裡面追加有清空處理方法

public void clean() ;    //清空集合           

2、在LinkImpl子類裡面覆寫方法

public void clean() {
    this.root = null ;  //後續的所有節點都沒了
    this.count = 0 ;   //個數清零
}           
連結清單資料“暗殺記” | 帶你學《Java面向對象程式設計》之九十四

圖五 執行結果三

if (result != null) {
    for (Object obj : result) {
        System.out.println(obj) ;
    }
}           

資料不為空,進行處理。

連結清單資料“暗殺記” | 帶你學《Java面向對象程式設計》之九十四

圖六 執行結果圖

這些就是連結清單的基本功能,當然,這隻是一個最簡單最基礎的單向連結清單的實作。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:連結清單實戰之寵物商店 | 帶你學《Java面向對象程式設計》之九十五 更多Java面向對象程式設計文章檢視此處