请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

链表删除的递归写法还有另外一种写法如下, 只不过比较复杂,老师帮我看下对么?

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;

}


正在回答 回答被采纳积分+3

2回答

提问者 triump 2018-06-23 11:57:38


       

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;    

}


0 回复 有任何疑惑可以回复我~
liuyubobobo 2018-06-23 09:53:22

递归是一种遍历的方式;迭代也是一种遍历的方式。对于我们这个问题,我们只需要遍历一次链表就可以了,在递归过程中写的这个while循环是没必要的。


另一方面,你的这个while循环本身是有问题的。循环体不能保证head改变,所以不能保证递归终止条件会达成,会形成无穷递归。

可以使用这个课程中5-2介绍的代码,使用简单的测试用例(题目中给出的测试用例就可以!),在本机调试一下试试看?应该可以很容易发现这个问题:)


也可以提交给Leetcode,先看看程序的正确性?然后再仔细调试:)


加油!

0 回复 有任何疑惑可以回复我~
  • 提问者 triump #1
    哦,把while 改成if 就可以了吧?
    回复 有任何疑惑可以回复我~ 2018-06-23 11:57:34
  • 提问者 triump #2
    老师,我把while 改成if  了 ,然后测试了下,貌似没问题
    回复 有任何疑惑可以回复我~ 2018-06-23 11:59:00
  • liuyubobobo 回复 提问者 triump #3
    得到的结果是正确的,但是进行了两次递归调用,其实一次就可以:)
    回复 有任何疑惑可以回复我~ 2018-06-23 12:15:23
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信