用于删除特定位置的项目的链接列表代码

时间:2017-10-23 15:08:53

标签: java linked-list

我正在处理Singly链接列表,并编写了一个函数,用于删除链接列表中特定位置的元素。

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

这是我的代码:

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

2 个答案:

答案 0 :(得分:1)

为什么您的代码不起作用

当你到达最后一项时,你将temp设置为null,但这不会影响内存中的链表,它只是将本地副本更改为等于null。

如何修复

您希望保留对前一个元素的引用,然后修改它,而不是保留当前项目

的伪代码

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
    }
}

答案 1 :(得分:0)

@jrtapsell有一个迭代解决方案,可以跟踪lastcurrent指针。这是一个递归解决方案,通过递归调用堆栈跟踪所有last指针。递归解决方案更容易理解和编写,但迭代解决方案是更好的IMO,因为它具有O(1)额外的内存开销而不是O(N)。

//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;
    }
}