递归删除链接列表中的最后一个匹配项Java

时间:2016-12-13 22:27:34

标签: java algorithm recursion

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

3 个答案:

答案 0 :(得分:1)

您可以声明指向上次发生的节点的指针,并在到达列表中的最后一个元素时删除该节点。以下步骤解释了 -

  1. 声明两个指针,一个是下一个,如上面的代码,另一个可以是temp。
  2. 像上面的deleteAll方法一样使用next迭代列表。
  3. 如果您发现要查找的节点将该节点分配给temp。在您的情况下为4.
  4. 当next为null时,你到达列表的末尾现在删除,无论节点是临时删除该节点。如果temp仍然为null,则在给定键中找不到节点。
  5. 编辑:  在递归的情况下可能的伪代码:

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

    以上代码应该能够解决您的问题。我在我的方法中进行了一些编辑,这应该从代码中显而易见,但让我在下面进行描述

    • 我添加了一个prev指针。因为如果我们要删除特定节点,我们需要将其下一个节点分配给prev节点。所以,我们需要prev节点而不是我们想要删除的节点。

    我认为这种变化也将遵循迭代方法。

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