我以前需要帮助调试我的deleteNode方法。它现在有效(下面发布的更新版本),但我希望它提供必须删除头节点的情况。目前,它返回一个NullPointerException,我在deleteNode中插入了 * 。我不知道当时我的变量是如何为空的,因为我的while循环要求position
和head
首先不为空。
public class LinkedList
{
private class Node
{
int item;
Node link;
@SuppressWarnings("unused")
public Node()
{
item = Integer.MIN_VALUE;
link = null;
}
public Node(int x, Node p)
{
item = x;
link = p;
}
}
private Node head;
public LinkedList()
{
head = null;
}
public boolean deleteNode (int target)
{
Node position = head;
boolean isGone = false;
while(position != null && head != null)
{
if(position.link == head && position.link.item == target)
{
head = head.link;
isGone = true;
return isGone;
}
*** else if(position.link.item == target && position.link != head)
{
position.link = position.link.link;
isGone = true;
return isGone;
}
position = position.link;
}
return isGone;
}
public void printList()
{
System.out.println("Your list is: ");
Node position = head;
while(position != null)
{
System.out.println(position.item + " ");
position = position.link;
}
System.out.println();
}
}
答案 0 :(得分:1)
LinkedList.deleteNode(int)
永远不会修改任何节点的link
,因此它不会从列表中删除任何元素。
假设nodeA.link == nodeB
和nodeB.item == target
。然后,您需要设置nodeA.link = nodeB.link
,以便不再指向nodeB
。
答案 1 :(得分:1)
以下列出了我看到的问题:
您实际要使用的枚举器position
永远不会更新。更新的枚举数,counter
不需要。
您永远不会删除该节点。为了删除节点,您需要将上一个节点的链接设置为匹配节点的链接,从而将其从链中删除。
您没有处理特殊情况。如果传递的列表为空,会发生什么?如果匹配节点是第一个节点会发生什么?最后一个节点?
您应该从调用函数返回链表的头部。删除链表的头节点时需要这样做。
由于这是一个家庭作业问题,请尝试自己解决,但希望这些要点会有所帮助。
答案 2 :(得分:0)
循环代码时查看你的deleteNode()。
while(position != null && counter != null)
{
itemAtPosition = position.item;
if(itemAtPosition == target)
{
position = position.link;
isGone = true;
}
counter = counter.link;
}
你更新了计数器,但从不参考它。位置永远不会改变,所以
if(itemAtPosition == target)
行永远不会返回true。我怀疑你需要在某处查看counter.item!
答案 3 :(得分:0)
首先,您没有为目标项目位于开头的情况编写代码,其中字段 head 应相应更新。其次,在遍历列表期间永远不会更新比较项。