每日一题——链表中倒数最后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;
}


相关文章
|
8天前
|
存储 Python
链表中插入节点
链表中插入节点
|
8天前
|
存储 Python
删除链表节点详解
删除链表节点详解
|
8天前
|
存储 Python
链表中删除节点
链表中删除节点
|
10天前
|
存储 C语言
C语言中处理动态数据类型链表节点冲突的技术探讨
C语言中处理动态数据类型链表节点冲突的技术探讨
19 0
|
12天前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
20 1
|
12天前
|
索引
【力扣刷题】删除链表的倒数第 N 个结点、两两交换链表中的节点、随机链表的复制
【力扣刷题】删除链表的倒数第 N 个结点、两两交换链表中的节点、随机链表的复制
17 0
|
12天前
|
Java
DAY-1 | Java数据结构之链表:删除无头单链表中等于给定值 val 的所有节点
力扣203题解:使用时间复杂度为O(n)的思路删除链表中所有值为key的元素。引入辅助指针pre,记录cur的前一个节点,遍历链表时,若cur.val!=key,pre和cur同时前进;若cur.val==key,则pre.next=cur.next,cur继续前进,确保pre不急于跟随以处理连续相同值的情况。遍历结束后,处理头节点可能需要删除的特殊情况。
24 0
|
16天前
24. 两两交换链表中的节点
24. 两两交换链表中的节点
32 6
|
16天前
|
存储 C语言
链表—初始化指针变和创建新的节点------区别应用分析
链表—初始化指针变和创建新的节点------区别应用分析
|
16天前
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点