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