【数据结构】C语言算法练习题——利用“快慢指针”去求返回一个单链表的中间结点

题目链接:

力扣https://leetcode.cn/problems/middle-of-the-linked-list/

解题思路:

1. 这类题中新手常见的思路是先遍历一遍单链表求出链表的长度然后再除以 2 ,然后从头开始又

进行一次遍历操作找到中间结点,虽然可以执行,但是如果题目要求只进行一次遍历,那么这种算

法就不适用了

2. 我们可以用 “ 快慢指针 ” 的思路去求解。

先定义俩个指针变量,一个命名为 slow , 意为慢指针。另一个命名为 fast , 意为快指针。

用这俩个指针去进行遍历单链表,但是要求快指针的速度是慢指针的俩倍,

这样无论单链表的长度是奇数还是偶数,当快指针遍历到单链表末尾,注意此时并不是遍历的结束

信号,而是需要进一步访问指针域里的指针,确保此结点的下一个结点为NULL

即为 NULL 时,慢指针此时指向的结点便是中间结点

参考代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* middleNode(struct ListNode* head)
{
    struct ListNode *slow,*fast;
    slow = head;
    fast = head;
    //fast的初始化尽量也设为head,防止单链表的长度为1的情况
    
    while (fast && fast->next)
    //使用&&的是因为不清楚单链表的长度是奇数还是偶数
    {
        slow = slow->next;
        fast = fast->next->next;//可使fast的遍历速度是slow的俩倍
    }

    return slow;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值