当前位置:   article > 正文

链表双指针问题_双指针跑步

双指针跑步

让我们从一个经典问题开始:给定一个链表,判断链表中是否有环。

想象一下,有两个速度不同的跑步者。如果他们在直路上行驶,快跑者将首先到达目的地。但是,如果它们在圆形跑道上跑步,那么快跑者如果继续跑步就会追上慢跑者。

这正是我们在链表中使用两个速度不同的指针时会遇到的情况:

  • 如果没有环,快指针将停在链表的末尾。
  • 如果有环,快指针最终将与慢指针相遇。

一般来说我们把快指针的速度设为2,慢指针设为1。

求环形链表的入环点

问题描述:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

首先必须认识到,快慢指针相遇的点并不一定是入环点。所以这时候我们需要第三个从头出发的指针,慢指针从相遇的出发,两个指针都以1的速度前进,最终的相遇点即为入环点。

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode *detectCycle(ListNode *head) {
  12. if(head==NULL) return NULL;
  13. ListNode *fast,*slow,*ring;
  14. fast=head;slow=head;ring=head;
  15. while(1)
  16. {
  17. if(fast==NULL)
  18. return NULL;
  19. else
  20. fast=fast->next;
  21. if(fast==NULL)
  22. return NULL;
  23. else
  24. fast=fast->next;
  25. slow=slow->next;
  26. if(slow==fast)
  27. break;
  28. }
  29. while(slow!=ring)
  30. {
  31. ring=ring->next;
  32. slow=slow->next;
  33. }
  34. return ring;
  35. }
  36. };

 相交链表相交点

问题描述:

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。

所谓相交链表,将末尾和其中一头相连不就是环形链表吗?而且入环点也就是相交点。
所以与上题不同的的不过是先首尾相接,找到入环位置再把链表复原。

删除链表的倒数第N个节点

问题描述:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

这题如果不用双指针则需要遍历两次。

在链头创建双指针,快指针先走n步,然后双指针同速前进直至快指针到链尾,此时慢指针的下一个节点就是要删除的。删除后返回头结点就可以了。

但是有一个特例,就是n=链表的长度时,即快指针=null,需要删去是头结点而不是慢指针的下一个。

  1. class Solution {
  2. public:
  3. ListNode* removeNthFromEnd(ListNode* head, int n) {
  4. ListNode *fast,*slow;
  5. fast=head;slow=head;
  6. for(int i=0;i<n;i++)
  7. fast=fast->next;
  8. if(fast==NULL)
  9. return head->next;
  10. while(fast->next!=NULL)
  11. {
  12. fast=fast->next;
  13. slow=slow->next;
  14. }
  15. if(n==1)
  16. {
  17. slow->next=NULL;
  18. }
  19. else
  20. {
  21. fast=slow->next->next;
  22. slow->next=fast;
  23. }
  24. return head;
  25. }
  26. };
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/956966
推荐阅读
相关标签
  

闽ICP备14008679号