好吧,我正在尝试为作业做这件事。我的排序循环链表存在问题。我可以添加和删除一些正常的东西,但有一个例外。该异常是列表中的第一个节点。它每次都在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.");
}
}
希望这有助于缩小代码问题的范围。
答案 0 :(得分:-1)
在add
方法中:
while (location != null)
因此,该方法希望location
有时为null
。这意味着该列表不是循环的,而是结束。
在find
方法中:
do {
if (location.getInfo().equals(target))
...
} while ((location != list) && !found);
因此,该方法希望location
永远不会是null
,就像在循环列表中一样。
在循环列表中,列表中的所有元素都指向列表中的另一个元素(在圆圈中)。
当列表有一个元素时,它将指向自身。
当列表有2个元素时,每个元素都指向另一个元素,依此类推。
在普通的链表中,最后一个元素将始终指向null
,代码需要预期。