簡體   English   中英

Java LinkedList刪除最后一個節點

[英]Java LinkedList removing the last node

我有一個Java類,它由節點列表WordNode組成,該節點列表具有Word類的屬性和一個稱為next的WordNode對象,該對象用作對下一個節點的引用,如下所示:

class WordNode
{
    Word word;
    WordNode next;

    WordNode(Word w)
    {
        word = w;
        next = null;
    }

    Word getWord()
    {
        return word;
    }
}

Word類有一個名為name的字符串:

class Word 
{
    String name;

    Word(String n)
    {
            this.name = n;
    }

    public String getName()
    {
            return name;    
    }

    public void setName(String n)
    {
        name = n;
    }
}

我有一個類,它是一個自定義LinkedList,必須通過指定單詞名稱在其中添加和刪除單詞。 我能夠添加而不會出現問題,但是當我要刪除時會遇到一些問題。 以下是刪除方法:

boolean remove(Word w)
{
    WordNode wm = new WordNode(w);

    if (list == null) return false; //can't delete on an empty list
    else
    {
        WordNode aux = list;

        while(aux != null)
        {
            if (wm.word.getName().compareTo(aux.word.getName()) == 0 ) //if the word to delete is found
            { 
                if (aux.next == null) //to erase the last element
                {
                    aux = null;       
                }
                else
                {
                    aux.word.setName(aux.next.word.getName()); //set current node's name to equal next node's

                    WordNode temp = aux.next.next;
                    aux.next = null; //to erase current node
                    aux.next = temp; //re-refer
                }                        
                return true;
            }
            else aux = aux.next;
        }

        return false; //reachable if word is not found
    }
}

list應該是包含所有節點的LinkedList。 aux是一個輔助列表,它將在list循環顯示,以避免取消鏈接。 因此,如果我選擇刪除WordNode,則會比較名稱。 實際上,當節點位於最后一個節點之外的任何位置時,它的移除效果很好:

if (aux.next == null) //to erase the last element
{
    aux = null;       
}

我希望將該節點設置為null,以將列表標記為新的結尾,但不會被擦除。 我可以更改哪些內容來擦除最后一個元素? 感謝您的任何幫助/建議

您必須清除WordNode的“下一個”指針。 由於沒有“上一個”指針,因此必須手動跟蹤上一個WordNode。

boolean remove(Word w)
{
    WordNode wm = new WordNode(w);

    if (list == null) return false; //can't delete on an empty list
    else
    {
        WordNode aux = list;
        WordNode prev = aux;

        while(aux != null)
        {
            if (wm.word.getName().compareTo(aux.word.getName()) == 0 ) //if the word to delete is found
            { 
                if (aux.next == null) //to erase the last element
                {
                    prev.next = null;
                    // Takes care of the case of a one-item list
                    aux = null;
                }
                else
                {
                    aux.word.setName(aux.next.word.getName()); //set current node's name to equal next node's

                    WordNode temp = aux.next.next;
                    aux.next = null; //to erase current node
                    aux.next = temp; //re-refer
                }                        
                return true;
            }
            else {
                prev = aux;
                aux = aux.next;
        }

        return false; //reachable if word is not found
    }
}

添加head節點。 然后,在檢查最后一個節點時,您將擁有:

if (aux.next == null) //to erase the last element
{
   aux.head.next = null;
}

暫無
暫無

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

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