【数据结构】快指针和慢指针
一、
给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
要求:只遍历一遍链表
可以使用快慢指针:fast 一次走两步,slow 一次走一步。当 fast == NULL(偶数个结点)或者 fast->next == NULL(奇数个结点)就停止,返回 slow。
struct ListNode* middleNode(struct ListNode* head)
{struct ListNode* slow, *fast; slow = fast = head; while(fast && fast->next){slow = slow->next; fast = fast->next->next;}return slow;
}
注意:
1、一次性定义多个指针时,第二个及以后的指针名前面都要加 * 。
2、while( )括号内是循环继续的条件。
二、
输入一个链表,输出该链表中倒数第k个结点。
要求:只遍历一遍链表
快慢指针:fast 先走 k - 1 步,然后 fast 和 sliow 同时走,直到 fast 走到链表的最后一个结点。
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
{struct ListNode* slow, *fast; slow = fast = pListHead;while(--k){fast = fast->next;}while(fast->next){slow = slow->next; fast = fast->next;}
}
三、
给你一个链表的头节点 head
,判断链表中是否有环。
使用快慢指针:fast 一次走两步,slow 一次走一步。
bool hasCycle(struct ListNode *head)
{ if(head == NULL)return false;if(head->next == NULL)return false;struct ListNode * slow = head;struct ListNode * fast = head;while(1){fast = fast->next;if(fast == slow)return true;if(fast == NULL)return false;fast = fast->next;if(fast == slow)return true;if(fast == NULL)return false;slow = slow->next;if(fast == slow)return true;if(slow == NULL)return false;}return false;
}