剑指offer系列之十三:链表中的倒数第k个节点

简介:

题目描述

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

举一个简单的例子,比如链表{1,2,3,4,5},如果要返回倒数第二个节点,也就是k=2,就相当于正数第5-k+1=4个节点,所以我们可以采用两次循环:一次循环得到链表的结点个数;另一次循环则是从链表中找到第n-k+1个节点。虽然是两次循环,但时间复杂度是O(n),需要注意的是,这里仍然需要对链表的边界条件进行判断。基于这种思路写出如下代码:

public ListNode FindKthToTail(ListNode head,int k) {
        if(head == null || k <= 0) return null;
        int nodesNum = 1;
        ListNode node = head;
        while(node.next != null){
            nodesNum++;
            node = node.next;
        }
        int i = 1;
        node = head;
        while(k <= nodesNum && i != nodesNum - k + 1){
            i++;
            node = node.next;
        }
        if(k <= nodesNum)
            return node;
        return null;
    }
AI 代码解读

还有一种思路就是创建两个指针,一个指针先走k-1部,当第k部的时候,另一个指针从第一个节点开始走,这样,第一个指针到达最后一个指针的时候,第二个指针刚好到达倒数第k个节点的位置。实现代码如下(已被牛客AC):

public ListNode FindKthToTail2(ListNode head,int k) {
        if(head == null || k <= 0) return null;
        ListNode pre = head;
        ListNode behind = null;
        for (int i = 0; i < k - 1; i++) {
            if(pre.next != null){
                pre = pre.next;
            }else {
                return null;
            }
        }

        behind = head;
        while(pre.next != null){
            pre = pre.next;
            behind = behind.next;
        }
        return behind;
    }
AI 代码解读
目录
打赏
0
0
0
0
85
分享
相关文章
|
5月前
|
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
104 1
|
5月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
51 0
LeetCode第二十四题(两两交换链表中的节点)
|
5月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
60 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
5月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
70 0
|
10月前
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
78 2
|
10月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
95 1
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等