这是一种在链表里常见的方法,因为链表的物理结构特殊性,我们如果说要删除链表中的倒数第5个元素,那么我们恐怕要先通过遍历整个链表来获得链表的长度,在遍历找到倒数第五的元素在哪。这样的方法太慢。如果我们定义两个指针p1,p2,让p1打头,让p2永远在距离p1 ,5个结点的地方,那么p1遍历完整个数组,p2自然也找到了倒数第五的地方,直接输出就行了。
我们再来看一个题目leetcode的876题,寻找链表的中间结点。
如果用快慢指针的话,就直接一遍遍历过了。
struct ListNode* middleNode(struct ListNode* head){
int i=0;
struct ListNode* p1=head;
while(head){
i++;
head=head->next;
if(i%2==0){
p1=p1->next;}
}
return p1;
}
让第二个指针永远保持在,第一个指针到头结点的位置的一半。这样就很快了。