bobo老师您好,关于leetcode-92号问题不需要考虑空指针异常的情况吗?

来源:5-1 链表,在节点间穿针引线 Reverse Linked List

慕斯902xzxc_das

2021-12-03

这是我的代码,在遍历过程中,对循环的条件做出的限制,就是保证循环内部不会抛出NullPointerException。

class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
            ListNode dummy = new ListNode(-1,head);
            ListNode prev = dummy;
            
            int i = 1;
            while ( i < left && prev.next != null ) {
                prev = prev.next;
                i++;
            }

            if(prev.next == null) return dummy.next;
            ListNode curr = prev.next;

            while ( i < right && curr.next != null ) {
                ListNode temp = curr.next;
                curr.next = temp.next;
                temp.next = prev.next;
                prev.next = temp;
                i++;
            }

            return dummy.next;
     }
}

这是官方的题解代码,并没有对空指针的问题进行约束,我自己在本地实测发现当left或right大于链表长度时确实会抛NullPointerException。

    public ListNode reverseBetween(ListNode head, int left, int right) {
        // 设置 dummyNode 是这一类问题的一般做法
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;
        ListNode pre = dummyNode;
        for (int i = 0; i < left - 1; i++) {
            pre = pre.next;
        }
        ListNode cur = pre.next;
        ListNode next;
        for (int i = 0; i < right - left; i++) {
            next = cur.next;
            cur.next = next.next;
            next.next = pre.next;
            pre.next = next;
        }
        return dummyNode.next;
    }

图片描述

比较奇怪,为啥不需要考虑这些问题呢?

写回答

1回答

liuyubobobo

2021-12-03

说明在测试用例中,没有 left 或者 right 比 n 大的情况。


这个问题后面的限制条件说明了这一点:

//img.mukewang.com/szimg/61a9972b0920698504020187.jpg


如果是笔试或者上机测试或者竞赛等情况,这并不是问题,拿到 ac 就好,但如果是面试的话,你的代码是更健壮的,道理上是更加分的:)


继续加油!:)

1
2
慕斯902xzxc_das
感谢bobo老师~!
2021-12-03
共2条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7408 学习 · 1150 问题

查看课程