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;
}


目录
相关文章
|
1月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
34 1
|
1月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
48 0
Leetcode第21题(合并两个有序链表)
|
1月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
65 1
|
1月前
|
存储 Java
HashMap之链表转红黑树(树化 )-treefyBin方法源码解读(所有涉及到的方法均有详细解读,欢迎指正)
本文详细解析了Java HashMap中链表转红黑树的机制,包括树化条件(链表长度达8且数组长度≥64)及转换流程,确保高效处理大量数据。
71 1
|
1月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
17 0
LeetCode第二十四题(两两交换链表中的节点)
|
1月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
40 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
1月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
46 0
|
1月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
77 0
|
1月前
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
21 0
|
1月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
16 0