实现了使用void返回值类型进行链表元素删除,并在LeetCode上进行测试

实现了使用void返回值类型进行链表元素删除,并在LeetCode上进行测试

class Solution {    
public ListNode removeElements(ListNode head, int val) { ListNode dummyHead = new ListNode(-1, head); removeElement(dummyHead, val);
return dummyHead.next; }
private void removeElement(ListNode head, int val) {
// 判断递归终止条件 if (head == null || head.next == null) {
return; }
if (head.next.val == val) { head.next = head.next.next; removeElement(head, val); } else { removeElement(head.next, val); } } }

http://img1.sycdn.imooc.com//climg/603a1b97097e4fc315300283.jpg

我尝试使用返回值为void实现删除链表元素,我发现返回值的作用其实是将链表进行链接,如果使用void实现的话,则需要往前找一个结点,这样的话在删除结点时可以将后续链表与前一个结点相连。但是这样会出现一个问题就是如果删除的是第一个结点的话,第一个结点是没有前置结点的,故需要创建一个虚拟头结点来为用户传入的第一个结点提供一个前置结点。

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

分析得非常正确,你学懂了:)


继续加油!:)

决殇 2022-04-10 19:30:33

    public ListNode removeElements(ListNode head, int val) {

        ListNode dummyHead = new ListNode(-1, head);

        removeElement(dummyHead, val);

        return dummyHead.next;

    }


    private void removeElement(ListNode head, int val) {

        // 判断递归终止条件

        if (head == null)

            return;


        while (head.next != null && head.next.val == val) {

            head.next = head.next.next;

        }

        removeElement(head.next, val);

    }

调用了两次removeElement还可以优化一下,调用一次就可以。不过好像不太属于递归了,因为要处理对应情况。


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2583    人
  • 解答问题       1082    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师