无法删除循环链表中的第一个节点

Unable to delete first node in circular linked list

好的,我正在尝试为作业执行此操作。我的排序循环链表出现问题。除了一个例外,我能够很好地添加和删除内容。该异常是列表中的第一个节点。每次在查找方法中,它都会在 "if (location.getInfo().equals(target))" 上崩溃。我不知道为什么,需要帮助。它吐出一条空指针错误消息并将其缩小为上述消息。例如,如果我输入 Adam,它会将其添加到列表中并适当地对其进行计数。但是,当我去删除该项目时,它会运行查找方法和查找方法上的 NPE。我已经尝试了 .equals(target) 和 ==,都给出了 NPE。

protected void find(T target)
{
    location = list;
    found = false;

    if(list != null)
    {
        System.out.println("\nFinding: " + target);
        do
        {
            previous = location; // move search to the next node
            location = location.getLink();

            if (location.getInfo().equals(target))*// checks for a match
            {
                System.out.println(target + " was found.");
                found = true;
            }
        } 
        while ((location != list) && !found);
    }
}

这是我的 LLNode.java:

public class LLNode<T> 
    {
    private LLNode<T> link;
    private T info;

    public LLNode(T info)
    {
        this.info = info;
        link = null;
    }

    public void setInfo(T info)
    {
        this.info = info;
    }

    public T getInfo()
    {
        return info;
    }

    public void setLink(LLNode<T> link)
    {
        this.link = link;
    }

    public LLNode<T> getLink()
    {
        return link;
    } 
}

如有任何帮助,我们将不胜感激。

此外,这是我的添加方法:

public void add(T element)
{
    LLNode<T> prevLoc;
    LLNode<T> location;
    T listElement;

    if (!element.equals(""))
    {   
        LLNode<T> newNode = new LLNode<T>(element);
        if(list == null)
        {
            list = newNode;
            newNode.setLink(list);
        }
        else if (list.getInfo().compareTo(element) > 0)
        {
            newNode.setLink(list.getLink());
            list.setLink(newNode);
            list = newNode;
        }
        else if (list.getInfo().compareTo(element) < 0)
        {
            newNode.setLink(list.getLink());
            list.setLink(newNode);

        }
        else
        {
            location = list.getLink();
            prevLoc = null;
            while (location != list)
            {

                listElement = location.getInfo();
                if (listElement.compareTo(element) < 0)
                {
                    prevLoc = location;
                    location = location.getLink();
                }
                else
                {
                    break;
                }
            }// Insert node into list
            if (prevLoc == null)
            {
                // Insert as first node
                newNode.setLink(list);
                list = newNode;
            }
            else
            {
                // Insert elsewhere
                newNode.setLink(location);
                prevLoc.setLink(newNode);
            }
        }
        numElements++;  
    }
    else
    {
        System.out.print("\nReturning to the main menu.");
    }
}

希望这有助于缩小我的代码问题所在的范围。

add方法中:

while (location != null)

所以该方法期望 location 有时是 null。这意味着列表不是循环的,而是有终点的。

find方法中:

do {
     if (location.getInfo().equals(target))
     ...
} while ((location != list) && !found);

所以该方法期望 location 永远不会是 null,就像在循环列表中一样。

在循环列表中,列表中的所有元素都指向列表中的另一个元素(在一个圆圈中)。
当列表只有一个元素时,它会指向它自己。
当列表有 2 个元素时,每个元素将指向另一个,依此类推。

在一个普通的链表中,最后一个元素总是指向 null 并且代码需要这样。