关于课程2-9 的一点小问题。
老师在这节课里面说了在以removeElements的那个递归里面是无法写成void的形式。我改写了算法发现的确无法做到,但我对自己算法的一个地方为什么没有按照我的想法实现有些疑惑请老师指教。
public static void removeElements5(ListNode head, int val) { while (head.next != null && head.val == val) { head = head.next; } while(head.next != null && head.next.val == val ){ ListNode node = head.next;; head.next = node.next; node.next = null; } if(head.next == null) { return; } removeElements5(head.next, val); } public static void main(String[] args) { int[] nums = {1, 6, 6, 3, 2, 3, 4, 5, 6}; ListNode head = new ListNode(nums); System.out.println(head); removeElements5(head, 6); System.out.println(head); }
我的思路是第一个循环判断如果节点头和要删除的值相等就直接把下一个节点定义为节点头。直到节点头和要删除的值不相等位置。
然后第二个循环判断该节点的下一个节点的值是否需要删除, 有的话就把它删除掉。
然后在下面对这个函数进行反复调用,每次调用的是下一个节点。
我试验了以后发现只要节点头的值和需要删除的值不相等,
类似于 int[] nums = {1, 6, 6, 3, 2, 3, 4, 5, 6}
结果就没有问题。
但是 像这种 int[] nums = {6, 6, 6, 3, 2, 3, 4, 5, 6};
结果就很奇怪
也就是
while (head.next != null && head.val == val) {
head = head.next;
}
这段没有写对,可以问下按照我的思路是哪里出了问题么,调试了很久始终没发现哪里有问题?
正在回答 回答被采纳积分+1
在 Leetcode 的这个问题中,是没有 dummyHead 的。head 就直接指向了第一个真正的存储元素的节点。
在你的 while 循环中,head.val == val 的节点,不一定要 head.next != null ,也需要删除,所以这个循环条件应该是:
while (head != null && head.val == val) { head = head.next; }
一下这段代码是我基于你的代码修改的,可以在 Leetcode 203 号问题获得通过的代码:
class Solution { public ListNode removeElements(ListNode head, int val) { if(head == null) return head; while (head != null && head.val == val) { head = head.next; } if(head == null) return head; while(head.next != null && head.next.val == val ){ ListNode node = head.next;; head.next = node.next; node.next = null; } if(head.next == null) { return head; } removeElements(head.next, val); return head; } }
在你的这个实现思路下,在递归调用 removeElements 的时候,由于已经确保了 head.next 不会被删除,所以递归可以不返回值。如果对此有困惑,强烈建议:
再仔细体会一遍课程中介绍的 removeElements 的微观解读中,为什么要有返回值。测试一下,如果没有返回值,为什么是错误的。
使用同样微观解读的方式,一步一步看一下,上面的这个代码为什么是正确的?
进步就发生在这个过程中哦。加油!:)
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星