如何删除链接列表中的特定节点

时间:2011-11-29 02:58:15

标签: java linked-list

我以前需要帮助调试我的deleteNode方法。它现在有效(下面发布的更新版本),但我希望它提供必须删除头节点的情况。目前,它返回一个NullPointerException,我在deleteNode中插入了 * 。我不知道当时我的变量是如何为空的,因为我的while循环要求positionhead首先不为空。

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();
}
}

4 个答案:

答案 0 :(得分:1)

LinkedList.deleteNode(int)永远不会修改任何节点的link,因此它不会从列表中删除任何元素。

假设nodeA.link == nodeBnodeB.item == target。然后,您需要设置nodeA.link = nodeB.link,以便不再指向nodeB

答案 1 :(得分:1)

以下列出了我看到的问题:

  1. 您实际要使用的枚举器position永远不会更新。更新的枚举数,counter不需要。

  2. 您永远不会删除该节点。为了删除节点,您需要将上一个节点的链接设置为匹配节点的链接,从而将其从链中删除。

  3. 您没有处理特殊情况。如果传递的列表为空,会发生什么?如果匹配节点是第一个节点会发生什么?最后一个节点?

  4. 您应该从调用函数返回链表的头部。删除链表的头节点时需要这样做。

  5. 由于这是一个家庭作业问题,请尝试自己解决,但希望这些要点会有所帮助。

答案 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 应相应更新。其次,在遍历列表期间永远不会更新比较项。