链表删除的递归写法还有另外一种写法如下, 只不过比较复杂,老师帮我看下对么?
来源:5-4 链表的天然递归结构性质
triump
2018-06-23
public ListNode removeElements(ListNode head, int val) {
// 递归基
if(head == null)
return head;
if (head .val == val) {
return head.next;
}
head.next = removeElements(head.next, val);
while (head.next ! = null) {
head.next = removeElements(head.next, val);
}
return head;
}
2回答
-
triump
提问者
2018-06-23
public ListNode removeElements(ListNode head, int val) {
// 递归基
if(head == null)
return head;if (head .val == val) {
return head.next;
}
head.next = removeElements(head.next, val);
、 if (head.next ! = null) {
head.next = removeElements(head.next, val);
}
return head;
}
00 -
liuyubobobo
2018-06-23
递归是一种遍历的方式;迭代也是一种遍历的方式。对于我们这个问题,我们只需要遍历一次链表就可以了,在递归过程中写的这个while循环是没必要的。
另一方面,你的这个while循环本身是有问题的。循环体不能保证head改变,所以不能保证递归终止条件会达成,会形成无穷递归。
可以使用这个课程中5-2介绍的代码,使用简单的测试用例(题目中给出的测试用例就可以!),在本机调试一下试试看?应该可以很容易发现这个问题:)
也可以提交给Leetcode,先看看程序的正确性?然后再仔细调试:)
加油!
092018-06-24
相似问题