美文网首页
链表-双指针妙用

链表-双指针妙用

作者: zhtttyi | 来源:发表于2020-04-15 18:21 被阅读0次

1. 返回链表的中间节点

给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。

分析:

快慢指针同时指向头节点,快指针走两步,慢指针走一步

如果长度为偶数,那么快指针为NULL的时候停止,长度为奇数,fast->next为NULL的时候停止

慢指针指向的位置就是中间节点了

按照这种思路,实现代码如下:

LinkNode *findMidNode(LinkNode *head)

{

LinkNode *fast = head;

LinkNode *slow = head;

while(NULL!= fast &&NULL!= fast->next )

{

fast = fast->next->next;

slow = slow->next;

}

returnslow;

}

2.链表的中间节点

输入一个单向链表,输出该链表中倒数第k个结点。为符合计数习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

例子

如:一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。

分析:

定义两个指针,指针移动一个快,一个慢(链表的长度l)

1.快慢指针同时指向头结点

2.首先快指针移动k-1步,先走到第k个节点

3.快慢指针同时移动,直到快指针指向末尾,这时,快慢指针都走了l-k,

4.慢指针指向的节点即为我们需要寻找的节点

参考代码实现如下:

LinkNode *FindKthToTail(LinkNode *head,unsignedintk)

{

    if(NULL == head || 0 == k)

        return head;

    LinkNode *pFast = head;

    LinkNode *pSlow = head;

    unsigned int i = 0;

    //快指针先移动

    while(i < k -1)

    {

        if(NULL != pFast)

        {

            pFast = pFast->next;

        }

        //k大于链表的长度

        else

        {

            return NULL;

        }

        i++;

    }

    //快慢指针一起移动

    while(NULL != pFast->next)

    {

        pSlow = pSlow->next;

        pFast = pFast->next;

    }

    return pSlow;

}

3.判断链表是否有环

如何判断一个单链表是否有环?若有环,如何找出环的入口节点。

按照快慢指针的思路,使用两个指针,一个指针每次走一步,另一个每次走两步,如果链表有环,那么它们终将相遇,而如果没有环,快的指针最后会指向NULL。

按照这种思路,我们的参考代码如下:

//0:无环,1:有环

int hasLoop(LinkNode *head)

{

    if(NULL == head)

        return 0;

        LinkNode *slow = head;

        LinkNode *fast = head->next;

        //当快指针到末尾时,无环,结束

        while (NULL != fast  && NULL != slow)

       {

            //快慢相遇,有环

            if (fast == slow)

                return 1;

                slow = slow->next; // 慢指针每次走一步

                fast = fast->next;

                if (fast != NULL)

                    fast = fast->next;

    }

    return 0;

}

相关文章

  • 链表-双指针妙用

    1.返回链表的中间节点 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回...

  • 数据结构重学日记(十)双链表

    概念 单链表:单个指针,单向火车。 双链表:双指针,电梯。 双链表在单链表的基础上增加了一个指向前边结点的指针。 ...

  • LeetCode 探索中级 [俩数相加][奇偶链表][相交链表]

    链表 @[链表|双指针] 链表问题相对容易掌握。 不要忘记"双指针解法",它不仅适用于数组问题,而且还适用于链表问...

  • 纯C手撕leetcode-基本数据结构-链表

    技巧 假头 新链表 双指针(正反向指针,快慢指针) 递归 例子:1.合并两个有序链表(假头,新链表) 链表反转(假...

  • 算法学习--双指针

    双指针分类 快慢指针 左右指针 快慢指针:主要解决链表相关问题,比如:典型的判断链表中是否包含环、链表倒是第K个节...

  • leetCode 141 Linked List Cycle

    关键字:链表、双指针 难度:easy 题目大意:检测给定的链表是否存在环 题目: 解题思路: 1、采用双指针,起始...

  • 双指针

    一、双指针总结 1.1题目 快慢指针(主要解决链表中的问题) 141.环形链表 142.环形链表 II 876.链...

  • leetcode第19题:删除链表中倒数第N个结点

    题目描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 考点 链表 双指针、滑动窗口指针 解...

  • LeetCode 数组专题 4:双索引技术之一:对撞指针

    在 LeetCode 上,专门有一个标签,名为“双指针”,有数组中的“双指针”,也有单链表中的“双指针”。 例题1...

  • 2020-02-16 刷题 3(链表)

    21 合并两个有序链表 标签:归并,双指针,链表解题思路类似于二路归并算法,采用双指针法,将其中一个链表作为待合并...

网友评论

      本文标题:链表-双指针妙用

      本文链接:https://www.haomeiwen.com/subject/qagcvhtx.html