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

时间:2015-04-07 21:19:17

标签: java linked-list circular-list

好吧,我正在尝试为作业做这件事。我的排序循环链表存在问题。我可以添加和删除一些正常的东西,但有一个例外。该异常是列表中的第一个节点。它每次都在find方法中崩溃“if(location.getInfo(。。equals(target))”。我不知道为什么需要帮助。它吐出一个空指针错误消息并将其缩小到上面的消息。如果我输入,例如,Adam,它会将其添加到列表中并适当地计算它。但是,当我去删除项目时,它会在find方法上运行find方法和NPE。我已经尝试了两种.equals(目标)和==,都给了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.");
    }
}

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

1 个答案:

答案 0 :(得分:-1)

add方法中:

while (location != null)

因此,该方法希望location有时为null。这意味着该列表不是循环的,而是结束。

find方法中:

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

因此,该方法希望location永远不会是null,就像在循环列表中一样。

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

在普通的链表中,最后一个元素将始终指向null,代码需要预期。