力扣876题--链表的中间节点(附完整代码和踩坑分析)

117 阅读1分钟

力扣第876题:链表的中间节点

题目描述:

给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。
示例 1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。

示例 2:
输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 34,我们返回第二个结点。

  这个题目很简单,采用快慢指针的方式就可以很快解决。但是笔者在答题时一直出错,现在记录一下。

附上代码:

public ListNode middleNode(ListNode head) {
            
            ListNode slow,fast;
            slow=fast=head;

            // while(fast.next!=null && fast!=null){   ----错误的方式
            while(fast!=null && fast.next!=null){
                slow=slow.next;
                fast=fast.next.next;
            }

            return slow;
    }

代码中有两个while语句,但是上一个会一直报错:(如下)

1655814735630.png

踩坑分析:

1655815018584.pngfast指针已经指向最后一个节点的next值时,即fast指向null时,

  • 如果写的是第一种while循环,那么fast指向的null,就没有next,所以会报空指针异常。
  • 如果是第二种while,条件中先判断fast为null,就不会再执行&&之后的内容,就可以完美规避这个问题。