【问题标题】:Recursively remove all occurrences of an item in a linked list递归删除链表中所有出现的项目
【发布时间】:2018-02-10 19:31:11
【问题描述】:
public static Node deleteAll(Node front, String target){
    if (front == null){ return null;}
    if (front.data.equals(target)){
        return deleteAll(front.next,target);
    }
    front.next=deleteAll(front.next,target);
    return front;
}

我正在尝试了解此解决方案,但这让我感到困惑。为什么它不总是结果为 null,因为最后 front 将等于 null。

【问题讨论】:

  • 它返回第一个函数调用的结果

标签: java recursion linked-list


【解决方案1】:

当考虑这些问题时,最好拿笔和纸画一些东西并从高层次上考虑它

例如
.............
输入
列表:[3]-[2]-[5]-null
目标:2
......

第一次调用 => 结果

deleteAll(N[3], 2) => [3]
但下一个现在是deleteAll(N[2], 2)
List = [3]-deleteAll(N[2], 2)

第二次通话

deleteAll(N[2], 2) => deleteAll(N[5], 2)
下一个节点现在跳过 2
List = [3]-deleteAll(N[5], 2)

第三次调用

deleteAll(N[5], 2) => [5]
但接下来是 deleteAll(null, 2)
List = [3]-[5]-deleteAll(null, 2)

Lat 调用返回 null

列表最终干净,没有 2s
List = [3]-[5]-null

【讨论】:

    【解决方案2】:

    你有三种情况:

    1. 原来front节点为null,所以你返回null。
    2. 原来的front节点持有target,所以你丢弃front并返回链接节点上递归调用的结果。
    3. 原来的front节点不持有target,所以对链接节点执行递归调用,返回front

    在数字 1 中返回 null,在数字 3 中返回非 null。在数字 2 中,您基本上会再次返回,因此返回 null 或下一个节点。以此类推。

    这意味着可以返回 null。但也可以返回非空值。

    【讨论】:

      猜你喜欢
      • 2021-05-14
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 2014-11-17
      • 2021-12-20
      • 2017-12-28
      相关资源
      最近更新 更多