每日一题——链表中倒数最后k个节点

简介: 每日一题——链表中倒数最后k个节点

链表中倒数最后k个节点

题目链接

思路

  • 思路一:由于单链表不能逆序遍历,因此我们可以先从头到尾遍历一次链表,求出链表的长度length,最后再从头到尾遍历一次链表,到第length - k + 1个节点时,即到达倒数第k个节点,返回这个节点即可。
  • 思路二:双指针法。我们可以定义快慢指针,并使其之间的距离为k,这样当快指针走到链表尾时,慢指针恰好停在了倒数第k个节点。

实现代码

思路一

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pHead ListNode类 
 * @param k int整型 
 * @return ListNode类
 */
struct ListNode* FindKthToTail(struct ListNode* pHead, int k ) {
    int length = 0;   //定义链表长度
    int address;    //定义倒数第k个节点的位置
    int count = 1;
    struct ListNode *tail = pHead;
    while(tail)
    {
        length++;
        tail = tail->next;    //计算长度
    }
    tail = pHead;
    if(k > length)    //如果k大于length,则说明链表长度不够,直接返回NULL
        return NULL;
    address = length - k + 1; //确定倒数第k个节点的位置
    while(count < address)
    {
        tail = tail->next;  //得到倒数第k个节点的位置
        count++;
    }
    return tail;  //返回倒数第k个节点
}

思路二

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pHead ListNode类 
 * @param k int整型 
 * @return ListNode类
 */
struct ListNode* FindKthToTail(struct ListNode* pHead, int k ) {
    int count=0;
    struct ListNode *fast, *slow;
    fast = slow = pHead;
    while(1)    //先让快指针比慢指针快k个节点
    {
        count++;
        if(!fast) //如果fast已经为NULL即已经走到表尾,count仍不等于k,说明k大于表长,直接返回NULL
            return NULL;
        fast = fast->next;
        if(count == k)
            break;
    }
    while(fast)   //当fast不为空,即没有走到表尾
    {
        fast = fast->next;  //快慢指针同时走一个节点
        slow = slow->next;
    }
    return slow;
}


相关文章
|
2月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
69 1
|
2月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
22 0
LeetCode第二十四题(两两交换链表中的节点)
|
2月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
44 0
Leetcode第十九题(删除链表的倒数第N个节点)
05_删除链表的倒数第N个节点
05_删除链表的倒数第N个节点
|
2月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
52 0
|
2月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
17 0
|
4月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
04_两两交换链表中的节点
04_两两交换链表中的节点
|
4月前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
54 5