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)

 

posted @ 2019-04-14 20:32  zpchya  阅读(160)  评论(0编辑  收藏  举报