【问题标题】: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】:
你有三种情况:
- 原来
front节点为null,所以你返回null。
- 原来的
front节点持有target,所以你丢弃front并返回链接节点上递归调用的结果。
- 原来的
front节点不持有target,所以对链接节点执行递归调用,返回front。
在数字 1 中返回 null,在数字 3 中返回非 null。在数字 2 中,您基本上会再次返回,因此返回 null 或下一个节点。以此类推。
这意味着可以返回 null。但也可以返回非空值。