一般方法
链表这种无法随机存取的数据结构,要定位到中间结点的方法通常是先把整个链表遍历一遍,得到整个链表的长度,再除以2,得到中间结点的位置,接着根据这个位置从头结点开始找到这个结点,时间复杂度为O(1.5n)具体代码如下
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* middleNode(ListNode* head) {
int len = 0;
ListNode *pt = head;
while (pt != nullptr)
{
len++;
pt = pt->next;
}
int mid = len / 2;
pt = head;
while (mid--)
pt = pt->next;
return pt;
}
};
快慢指针法
这是我在LeetCode上学习到的方法,我自己把这种方法称作长短腿法(感觉很形象)
class Solution {
public:
ListNode* middleNode(ListNode* head) {
ListNode *longleg = head, *shortleg = head;
while(longleg != nullptr && longleg->next != nullptr)
{
longleg = longleg->next->next;
shortleg = shortleg->next;
}
return shortleg;
}
};
长腿走两步,短腿走一步,当长腿走到链表末尾时,短腿刚好走到链表的一半,时间复杂度为O(n)