首页 > 解决方案 > 使用java中的单个方法/函数从任何索引处的单链表中删除一个节点

问题描述

我想从java中的单链表中创建和删除一个节点。删除方法将获取节点的索引并删除该节点。

逻辑正在运行,但它没有删除第一个索引(0)处的节点我如何修改此代码以便它可以在不使用额外循环的情况下删除任何位置的节点。我知道我在代码中使用起始索引为 1,但我无法理解如果输入的索引为零,那么程序如何使用相同的循环删除“previousNode”。它将需要另一个循环(基于此逻辑)。有没有办法删除这个额外的循环

public E deleteNode(int t) throws IndexOutOfBoundsException{
        if(size==0) 
            return null;

        if(t>=size) 
            throw new IndexOutOfBoundsException("Invalid Input");

        Node<E> previousNode=head;
        Node<E> currentNode=previousNode.getNext();
        int currentIndex=1;


        while(currentIndex<t){

            previousNode=previousNode.getNext();
            currentNode=previousNode.getNext();
            currentIndex++;
        }
        previousNode.setNext(currentNode.getNext());
        size--;
        return currentNode.getElement();
    }

如果用户输入索引 0,那么 {1,2,3,4} 的输出应该是 {2,3,4} 但我得到 {1,3,4}。

标签: javasingly-linked-list

解决方案


一种选择是将其作为特殊情况处理,因为它需要更新head

if (t == 0) {
    head = head.getNext();
}
//rest of your code..
Node<E> previousNode=head;
//...

或者,你可以这样做

Node<E> previousNode = null;
Node<E> currentNode = head;
int currentIndex = 0;

while(currentIndex < t) {
    previousNode = currentNode;
    currentNode = currentNode.getNext();
    currentIndex++;
}
if (previousNode == null) { //removing first node
    head = head.getNext();
} else {
    previousNode.setNext(currentNode.getNext());
}
size--;
return currentNode.getElement();

但无论如何,您需要将其作为特殊情况处理。


推荐阅读