LeetCode-876 链表的中间结点
对于链表的中某个位置结点的定位一般都会用到两个链表结点指针,例如链表倒数第K个结点问题使用的是先后指针,该题中用到的快慢指针。
本题的具体解法就是快指针走两步、慢指针走一步知道遍历完结点,重点是分清题目所要求的中间结点。本题中如果链表长度n为偶数,那么中间结点位置就为n / 2 + 1;为奇数,中间结点位置也为n / 2 + 1。所以中间结点位置就为慢指针所在位置,而且不需要哨兵结点来辅助定位(一开始想的就是哨兵结点辅助定位,最后还变复杂了)。
代码如下:
1 class Solution { 2 public: 3 ListNode* middleNode(ListNode* head) { 4 ListNode *pQuick = head, *pSlow = head; 5 while (pQuick && pQuick->next) 6 { 7 pQuick = pQuick->next->next; 8 pSlow = pSlow->next; 9 } 10 11 return pSlow; 12 } 13 };
时间复杂度为O(n),空间复杂度为O(1)