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

来源: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;    

}


0
0

liuyubobobo

2018-06-23

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


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

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


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


加油!

0
9
triump
回复
liuyubobobo
谢谢! 老师负责任的态度,敬你!
2018-06-24
共9条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程