【Leetcode】876.链表的中间结点 (遍历链表)

leetcode-876.png

这题可能是我做leetcode以来,最简单的一题了
寻找链表的终点
这题只需要考虑链表节点的奇偶性即可
根据题目描述

// 奇数,返回中间节点
[1,2,3,4,5]
// 偶数,返回中间的后面一个节点,也就是4节点
[1,2,3,4,5,6]

只需要用快慢指针即可
快的走两步,慢的走一步
如果是奇数个节点的时候,不需要额外处理,直接返回即可
如果是偶数个节点的时候,那上面的例子来说,fast指针会指向5节点,slow节点会指向3节点
此时只需要判断fast节点的next是否为空即可,如果不为空,那么就是偶数个节点,slow再走一步即可

class Solution {
  public ListNode middleNode(ListNode head) {
    ListNode slow = head;
    ListNode fast = head;
    while (fast.next != null && fast.next.next != null) {
      fast = fast.next.next;
      slow = slow.next;
    }
    if (fast.next != null) {
      slow = slow.next;
    }
    return slow;
  }
}

对于上面的过程,可以优化
从while开始下手即可
这样就不用判断,fast指针是否还有下一个节点了
对比上面的解法,仅仅是将fast指针的判断往前挪动了一位

class Solution {
  public ListNode middleNode(ListNode head) {
    ListNode slow = head;
    ListNode fast = head;
    while (fast != null && fast.next != null) {
      fast = fast.next.next;
      slow = slow.next;
    }
    return slow;
  }
}

需要注意一个问题,对于第二种解法,在while判断的时候,需要注意
不能将 fast 与 fast.next 判断写反
程序首先判断的是fast.next
解释下原因就是
当fast指向5节点的时候,还是能进入while,此时满足 fast != null 以及 fast.next != null
进入循环后fast = fast.next.next 也就是 fast = null
此时再进入while判断,fast.next ,就会报错,因为fast本身为null,是没有next节点的
所以首先应该判断fast是否为空,此时fast为空就直接终止while

你可能感兴趣的:(【Leetcode】876.链表的中间结点 (遍历链表))