我正在处理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;
}
}
答案 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有一个迭代解决方案,可以跟踪last
和current
指针。这是一个递归解决方案,通过递归调用堆栈跟踪所有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;
}
}