我正在尝试仅使用 list.first
和 list.next
从链表中删除项目的第一个出现。(这不是使用 Java LinkedList<E>
。
我编写了以下代码,但它删除了所有匹配项,而不仅仅是第一个:
private static <T> Cell<T> remove(T n,Cell<T> list)
{
Cell<T> ptr; // pointer
Cell<T> temp=null; // new empty list
for(ptr=list; ptr!=null; ptr=ptr.next) {
if(!ptr.first.equals(n))
temp=new Cell<T>(ptr.first,temp); //I guess this is the problem
}
if(ptr!=null)
ptr=ptr.next;
for(; temp!=null; temp=temp.next)
ptr=new Cell<T>(temp.first,ptr);
return ptr;
}
如果n
等于3
,list
等于[1,3,4,5,3,2]
,我得到的结果是[1,4,5,2]
,但我希望它是[1,4,5,3,2]
。
有人可以帮助我了解我做错了什么吗?
修改原始列表可能比创建新列表更容易。您可以简单地保留指向列表头部的指针,并使用当前和上一个指针循环访问列表。找到第一个包含 n 的单元格时,重新绑定前一个单元格的 .next 以跳过当前单元格。这样,您可以立即返回列表的头部,而无需继续递归。