无法删除循环链表中的第一个节点
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
并且代码需要这样。
好的,我正在尝试为作业执行此操作。我的排序循环链表出现问题。除了一个例外,我能够很好地添加和删除内容。该异常是列表中的第一个节点。每次在查找方法中,它都会在 "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
并且代码需要这样。