单向链表的 deleteNode java

deleteNode for singly linked list java

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

我可以删除特定节点但无法删除第一个节点。

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

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

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

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