876. 链表的中间结点
题目链接:876. 链表的中间结点
题目描述:给你单链表的头结点
head
,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head)
{
//创建快慢指针
ListNode* slow = head;
ListNode* fast = head;
while(fast && fast->next)
{
//慢指针走一步,快指针走两步
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
解题思路:
有两个指针在同一链表上,从同一头结点 head
出发。一个指针的速度是另一个指针的两倍。当速度快的指针到达终点时,速度慢的指针正好就走了一半的路程,也就是到达了中间位置。
快慢指针使用方法总结:
当你遇到一个链表问题时,可以问自己以下几个问题来判断是否适用快慢指针:
-
我是不是在寻找一个特殊位置的节点,而不是特定值的节点?
-
这个问题能否通过两个指针的"追及"或"相对距离"来解决?
-
我能否通过让一个指针比另一个走得快,或者先走几步,来创造出解决问题的有利条件?
如果答案是肯定的,那么快慢指针很可能就是解决问题的金钥匙。