class Link{
private int value;
private Link next;
}
我被要求编写一个递归方法来删除某个值的最后一次出现,比如4。
在2-> 3-> 4-> 5-> 4-> 2之前 在2-> 3-> 4-> 5-> 2
之后仅限最后一次出现。我知道如何删除所有出现但我无法判断它是否是最后一次出现。不允许使用辅助方法。
删除所有事件
public Link deleteAll(){
if (next == null){
return value==4? null:this;
}else{
if (value == 4){
return next.deleteAll();
}
next = next.deleteAll();
return this;
}
}
答案 0 :(得分:1)
您可以声明指向上次发生的节点的指针,并在到达列表中的最后一个元素时删除该节点。以下步骤解释了 -
编辑: 在递归的情况下可能的伪代码:
public void deleteLast(Node node,Node temp,Node prev, int data)
{
if(node==null)
{
if(temp!=null && temp.next.next!=null){
temp.next = temp.next.next;}
if(temp.next.next==null)
temp.next = null;
return;
}
if(node.data==data)
{
temp = prev;
}
prev = node;
deleteLast(node.next, temp, prev, int data);
}
以上代码应该能够解决您的问题。我在我的方法中进行了一些编辑,这应该从代码中显而易见,但让我在下面进行描述
我认为这种变化也将遵循迭代方法。
答案 1 :(得分:0)
并未真正回答您的确切问题,但作为替代选项,您可以考虑以下内容。
编写一个递归方法来删除指定值的第一个匹配项,如下所示:
public Link deleteFirst(int target) {
if (value == target) {
return next;
}
next = (next == null) ? null : next.deleteFirst(target);
return this;
}
然后,您可以根据需要将reverse()
方法编写为迭代或递归方法。我没有把它包括在内,但谷歌搜索应该显示一些有用的想法。
最后,从链表中删除最后一个值的方法可以这样写出:
public Link deleteLast(int target) {
return reverse().deleteFirst(target).reverse();
}
请注意,只要您的reverse()
方法具有线性复杂度,此操作也将是线性复杂度,但常量将高于必要值。
答案 2 :(得分:0)
诀窍是在返回途中完成工作 - 根本不需要额外的参数,助手或假设:
Link deleteLast(int target) {
if (next == null) {
return null;
}
Link deleted = next.deleteLast(target);
if (deleted == null) {
return value == target ? this : null;
}
if (deleted == next) {
next = deleted.next;
}
return deleted;
}