快慢指针是较常用的一种算法,以两道题为例,具体实现下:
Leetcode.876—链表的中间节点
引用快慢指针
转化为代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* middleNode(struct ListNode* head){
struct ListNode* fast = head,*slow = head;
while(fast && fast->next)//或
{
slow = slow->next;//一次一部
fast = fast->next->next;//一次两步
}
return slow;
}
牛客——链表中倒数第k个结点
这个也是快慢指针的典型题型,应用快慢指针:
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
// write code here
struct ListNode* fast = pListHead,* slow = pListHead;
//fast先走k步
while(k--)//一定是k--,差距为k的情况。--k,差距为k-1次
{
//说明k比链表的长度要大,那么倒数第k个为空
if(fast == NULL)
{
return NULL;
}
fast = fast->next;
}
//fast和slow一起走
while(fast)
{
slow = slow->next;
fast = fast->next;
}
return slow;
}
但是也有要注意的点,因为牛客网并没有力扣环境较完善,所以有学会运用一些个方法,将来校招也大多以牛客为主,所以必须要适应。