deleteNode用于单链表java

时间:2016-01-05 22:25:13

标签: java singly-linked-list

public void deleteNode(Student targetNode) {

    Node position = head;
    Node nextPosition1;
    Node nextPosition2;

    while (position.getLink() != null) {

        if (position.getLink().getData().equals(targetNode)) {

            nextPosition1 = position.getLink();
            nextPosition2 = nextPosition1.getLink();
            position.setLink(nextPosition2);

        } else {
            position = position.getLink(); 
        }
    }
}

我可以删除特定节点,但不能删除第一个节点。

1 个答案:

答案 0 :(得分:0)

您的for循环始终检查您所在位置的 next 链接是否与目标节点相等。因此,它永远不会看第一个值(头部)。解决这个问题最简单的方法就是添加一个子句来明确检查头部是否相等,如果它存在,则将头部推进到它的链接,否则输入你的while循环来检查所有未来的链接。我相信您还希望在删除链接的if子句中添加break;,除非您正在寻找实际上可能删除多个节点而不仅仅是一个节点(正如您的函数名称所示)。 / p>

public void deleteNode(Student targetNode) {
    Node position = head;
    if (position.getData().equals(targetNode)) {
        head = position.getLink();
    }
    else {

        Node nextPosition1;
        Node nextPosition2;
        while (position.getLink() != null) {

            if (position.getLink().getData().equals(targetNode)) {

                nextPosition1 = position.getLink();
                nextPosition2 = nextPosition1.getLink();
                position.setLink(nextPosition2);

            } else {
                position = position.getLink(); 
            }
        }
    }
}

另一种方法是检查当前位置(跟踪前一节点)并在它等于targetNode后将其删除。如果前一个节点为空,那么我们知道我们正在查看头部(并且应该更新头部),否则我们会查看列表中的中间/结束链接。

public void deleteNode(Student targetNode) {
    Node position = head;
    Node previous = null;
    while (position != null) {
    {
        if (position.getData().equals(targetNode)) {
            if (previous == null) {
                head = position.getLink();
            }
            else {
                previous.setLink(position.getLink());
            }
            break;
        }
        else {
            previous = position;
            position = position.getLink();
        }
    }
}