一、快慢指针
快慢指针是解决链表环问题的一个常见技巧
在这个方法中,我们设置两个指针,一个快指针(每次移动两步)和一个慢指针(每次移动一步)
二、“链表的中间结点”
1、题目:
2、解题思路:
通过快慢指针找到中间节点,快指针每次走两步,慢指针每次走一步,当快指针走到结尾的时候,慢指针正好走到中间位置
3、代码实现:
/*** 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、代码实现:
/*** 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、测试用例:
微语:迎着扑面而来的风,点点星光,以及街道两边那道无限往外延伸、延至天边的光