一、快慢指针
快慢指针是解决链表环问题的一个常见技巧
在这个方法中,我们设置两个指针,一个快指针(每次移动两步)和一个慢指针(每次移动一步)
二、"链表的中间结点"
1、题目:
2、解题思路:
通过快慢指针找到中间节点,快指针每次走两步,慢指针每次走一步,当快指针走到结尾的时候,慢指针正好走到中间位置
3、代码实现:
cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* middleNode(struct ListNode* head) {
struct ListNode *fast;
struct ListNode *slow;
fast = slow = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
4、测试用例:
三、"环形链表"
1、题目:
2、解题思路:
定义快慢指针fast,slow, 如果链表确实有环,fast指针一定会在环内追上slow指针
3、代码实现:
cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool hasCycle(struct ListNode *head) {
if(head == NULL || head->next == NULL)
{
return false;
}
struct ListNode *fast;
struct ListNode *slow;
fast = head->next;
slow = head;
while(slow != fast)
{
if(fast == NULL || fast->next == NULL)
{
return false;
}
slow = slow->next;
fast = fast->next->next;
}
return true;
}
4、测试用例:
微语:迎着扑面而来的风,点点星光,以及街道两边那道无限往外延伸、延至天边的光