ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

链表常见(典型)题目(一)快慢指针

2020-11-30 22:04:09  阅读:216  来源: 互联网

标签:快慢 head slow ptr2 fast next 链表 指针


此处的快慢指的是每次移动的步数

比如定义一个slow和fast指针都指向第一个节点:

ListNode *slow  = head;
ListNode *fast  = head;

slow每次走一步,fast每次走两步:

      while (fast != nullptr) {
            slow = slow->next;
            fast = fast->next;
        }

此处代码最终的slow将指向链表的中间节点

如果链表的节点个数为奇数如:1 2 3 4 5,slow则为3

        如果为偶数:1 2 3 4 5 6,则slow为第二个中间节点即为5

在纸上画一下,很容易证明上面的取得中间节点的结论

 

来看一个典型的快慢指针问题

判断单链表是否有环

结合生活中的场景我们不难想到:你是否有见过在一个环形跑道上赛跑的人,被猛男甩开几圈的场景。快慢指针同理,由于快指针步数比慢指针多,倘若有环,快指针必定会追上慢指针

代码如下:

bool hasCycle(ListNode* head) {
    if (head == NULL) {
        return false;
    }
    ListNode* ptr = head;

    ListNode* ptr2 = head->next;
    while (ptr != ptr2) {
        if (ptr2 == NULL ||ptr2->next ==NULL) {//如果把ptr2->next==NULL
            //放在前边则会报错
         /*   原因是没有判断当前指针是否指向了一个有意义的位置。
                我们只需要增加令其有意义的判断条件即可,即指针是否为NULL:*/
            return false;
        }
        ptr = ptr->next;
        ptr2 = ptr2->next->next;
    }
    return true;
}

 

 

 

标签:快慢,head,slow,ptr2,fast,next,链表,指针
来源: https://www.cnblogs.com/ziggystardust-pop/p/14048535.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有