Java 用于在特定位置删除项目的链表代码

Java 用于在特定位置删除项目的链表代码,java,linked-list,Java,Linked List,我正在研究单链表,并编写了一个函数,该函数将删除链表中特定位置的元素 我面临的问题是,如果链表中只剩下一个元素,我就无法删除该元素 这是我的密码: void deleteAtPosN(int position) { int i = 1; LinkedList temp = head; if (position <= 0) return; while (i < position - 1) { temp = temp.

我正在研究单链表,并编写了一个函数,该函数将删除链表中特定位置的元素

我面临的问题是,如果链表中只剩下一个元素,我就无法删除该元素

这是我的密码:

void deleteAtPosN(int position) {

    int i = 1;
    LinkedList temp = head;

    if (position <= 0)
        return;

    while (i < position - 1) {
        temp = temp.next;
        ++i;
    }

    if (temp == null) {
        System.out.println("list is empty");
    } else if (i == position) {
        temp = null;
    } else {
        LinkedList deleteElement = temp.next;
        temp.next = deleteElement.next;
    }
}
void deleteAtPosN(内部位置){
int i=1;
链接列表温度=头;
如果(说明代码不起作用的原因)
当您到达最后一项时,您将temp设置为null,但这不会影响内存中的链表,它只是将您的本地副本更改为null

如何修复 您希望保留对上一个元素的引用,并修改其下一个元素,而不是保留当前项

伪码
fun removeN(索引){
无功电流=水头
var last=null
对于(int i=0;i
您有一个@jrtapsell提供的迭代解决方案,它跟踪
最后一个
当前的
指针。下面是一个递归解决方案,它通过递归调用堆栈跟踪所有的
最后一个
指针。递归解决方案更容易理解和编写,但迭代解决方案更好因为它有O(1)额外的内存开销,而不是O(N)


我假设
head
指向列表的开头。如果要删除第一个(第0个索引)元素,则需要对
head
执行什么操作?@MFisherKDX删除第一个元素的引用node@BatCat抱歉-我误读了问题,所以答案被删除:)你有一个索引问题请允许我用这个评论来抨击链表,链表通常是计算机科学教育的一部分,它使人们认为它们在实践中很有用。实际上,在10个案例中,有9个应该被ArrayList取代。
fun removeN(index) {
    var current = head
    var last = null
    for (int i = 0; i < index; i++) {
        last = current
        current = current.next
        i++
    }
    if (last == null) {
        // We are at the head of the list
        head = current.next
    } else {
        last.next = current.next
    }
}
//zero based indexing, assumes position >= 0
public void deleteAtPosN(int position)
{
    head = deleteAtPosNHelper(head, position);
}

//assumes position >= 0
private LinkedList deleteAtPosNHelper(LinkedList current, int position)
{
    if (current == null)
    {
        return null;
    }
    else if (position == 0)
    {
        return current->next;
    }
    else
    {
        current->next = deleteAtPosHelper(current->next, --position);
        return current;
    }
}