Java LinkedList删除最后一个节点

时间:2014-11-16 03:25:49

标签: java linked-list

我有一个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以标记列表的新结尾,但它不会被删除。我可以更改什么来擦除最后一个元素?感谢您提前提供任何帮助/建议

2 个答案:

答案 0 :(得分:2)

你必须清除WordNode"" next"指针。因为你没有"之前的"指针,您必须手动跟踪以前的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
    }
}

答案 1 :(得分:0)

添加head节点。 然后在检查最后一个节点时,您将拥有:

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