876.链表的中间结点-力扣 链表中倒数第k个结点-牛客 (快慢指针方法)

简介: 876.链表的中间结点-力扣 链表中倒数第k个结点-牛客 (快慢指针方法)

目录

链表的中间节点

链表中倒数第k个结点

链表的中间节点

OJ链接:链表的中间结点


给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。


这里,最容易想起的一个方法就是:先遍历一遍链表,得出链表长度,再遍历出这个链表的中间节点


其实还有一个更妙的方法,就是使用快慢指针 :


定义slow指针和fast指针

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


假设当前链表个数是奇数个:



dc9c839aab2042068ea977c2b4f5462d.png



过程如下:



ed0893c6b98c4d708e8e1f727fd3feee.gif



可以看到,当fast移动到最后时,slow的位置恰好是中间节点:




929c09cbc3f641328e5b7062c7d69310.png



所以就可以得,其代码的循环条件为fast->next!=NULL


假设当前链表个数是偶数个:


1cc00804ccb649e786f7f59f9bb220aa.gif




过程如下:

同样可以发现:

最后当fast为空时,,slow指向中间节点,所以对于偶数个节点的链表来说,循环条件是fast!=NULL


所以,代码如下:


struct ListNode* middleNode(struct ListNode* head){
    struct ListNode* slow,*fast;
    slow = fast = head;
    while(fast&&fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
    }
    return slow;
}


链表中倒数第k个结点

OJ链接:链表中倒数第k个结点


描述:

输入一个链表,输出该链表中倒数第k个结点。


示例1

输入: 1,{1,2,3,4,5}

返回值:{5}


这道题的思路是:

倒数第k个节点,距最后一个节点的距离是k-1

所以可以先让fast指针移动k-1步,之后slow和fast一起移动,每次移动一步,直到fast->next==NULL

先让fast指针移动k步,之后slow和fast一起移动,每次移动一步,直到fast==NULL


过程如下:


b9bcd830a5e14cbb9164b36386948c46.gif







代码如下:


struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    // write code here
    if(pListHead==NULL)
    {
        return NULL;
    }
    struct ListNode* slow,*fast;
    slow = fast = pListHead;
    while(k--)
    {
        if(fast==NULL)
        {
            return NULL;
        }
        fast = fast->next;
    }
    while(fast)
    {
        fast = fast->next;
        slow = slow->next;
    }
    return slow;
}


目录
相关文章
|
2月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
76 1
|
1月前
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
20 1
|
3月前
链表的中间结点
链表的中间结点
181 57
|
2月前
|
存储 Java
HashMap之链表转红黑树(树化 )-treefyBin方法源码解读(所有涉及到的方法均有详细解读,欢迎指正)
本文详细解析了Java HashMap中链表转红黑树的机制,包括树化条件(链表长度达8且数组长度≥64)及转换流程,确保高效处理大量数据。
106 1
|
2月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
18 0
|
4月前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
5月前
【数据结构OJ题】链表中倒数第k个结点
牛客题目——链表中倒数第k个结点
40 1
【数据结构OJ题】链表中倒数第k个结点
|
4月前
【刷题记录】链表的中间结点
【刷题记录】链表的中间结点
|
5月前
【数据结构OJ题】链表的中间结点
力扣题目——链表的中间结点
28 0
【数据结构OJ题】链表的中间结点