簡體   English   中英

從鏈接列表中刪除項目

[英]Remove Item from Linked List

我添加了注釋來解釋我的邏輯

public void removeStrin(String name) throws IllegalArgumentException {
    // If the name is equal to null throw an exception
    if(name == null) {
        throw new IllegalArgumentException();
    }

    //set the removeTempString to the head
    Game Rem = head; 

做這樣的事情,設置previous.nxt = nodetobedeleted.next; 以及 notobedeleted 可能擁有的空和資源。

        public void removeGame(String name) throws IllegalArgumentException {
            // If the name is equal to null throw an exception
            if(name == null) {
                throw new IllegalArgumentException();
            }

            //set the removeTempString to the head
            Game removeTempString = head;
            Game prev = null;
            //while it is not null
            while(removeTempString != null) {
                //if the removeTempString.name equals the String name
                if(removeTempString.name.equals(name)){
                     if(prev != null){
                          prev.next  = removeTempString.next;
                     }
                }
                // set prev to current`enter code here`
                prev = removeTempString;
                // to iterate set it to next node in list
                removeTempString = removeTempString.next;//the next pointer you have

    }

總而言之,您的問題需要在鏈表中查找和刪除節點,而不管其在鏈中的位置,因此,它可能是第一個、最后一個或中間的某個位置。

下面提供了一些關於該問題的安全假設。

  1. Game類具有以下結構。

     class Game{ public String name; public Game prev; public Game next; }
  2. 對象已在包含類中定義。

removeGame()方法必須在以下三組場景中編碼,這些場景將隱式處理節點刪除。 如果它返回一些東西,您可以獲得有關成功刪除的信息。 這里它返回布爾值。 它實際上基於主題,需要刪除的主題節點必須成為垃圾收集的候選者。

public boolean removeGame(Game txt)
{
if(txt==null)return false;
Game itr = head;

//if its header
if(itr.name.equals(txt.name))
{
Game newHead = head.next;
head=newHead;
//The previous header hence gets derefrenced and becomes a candidate of garbage collection
return true;
}

//if its midway or end
itr = head.next;
while(itr!=null){
Game subjectNode = itr;
if(subjectNode.name.equals(txt.name))
 {
 Game newPrev = subjectNode.prev;
 Game newNext = subjectNode.next;
 newPrev.next = subjectNode.next;
 newNext.prev= subjectNode.prev;

 subjectNode=null;
//This makes it derefrenced and hence subject to garbage collections after refrence swaps.
     return true;
     }
    itr = itr.next;
     }
    return false;
     }

此外,由於您正在執行 java 實現,因此更喜歡使用 java 的 util 包的LinkedList類來適應您的場景。

嘗試使用此邏輯,它適用於兩種方式

public Object delete(Object key) // works
{
    Node prev = null;
    Node curr = top;
    Object result = null;

    //search for the key
    while((curr != null) && (!curr.getData().equals(key)))
    {
        prev = curr;
        curr = curr.getNext();
    }

    //found the item we are looking for!
    if ( curr != null )
    {
        //wait! is the item we are looking for the first element in the list?
        if ( prev != null )//nah, it's not 
        {
            prev.setNext(curr.getNext());
        }else //yes! it is 
        {
            top = curr.getNext();
        }
    }

    return result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM