`

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

阅读更多

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

 

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

 

解法一:先递归到尾部,然后开始向前遍历,并计数,计数达到k时return

/*
public class ListNode {
    int val;
    ListNode next = null;
 
    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    ListNode targetNode;
    int currK;
    public ListNode FindKthToTail(ListNode head, int k) { // 递归解法,比较渣
        if (k < 0 || head == null) {
            return null;
        }
        if (head.next != null) {
            FindKthToTail(head.next, k);
        } else {
            currK = k - 1;
        }
        if (currK-- == 0) {
            targetNode = head;
        }
        return targetNode;
    }
}

 

 

解法二:两个指针。第一个先正向移动到第K个节点(即移动k-1步),然后两个指针一起正向移动,当第一个指针到尾时,第二个指针指向的节点即为倒数第k个节点

 

/*
public class ListNode {
    int val;
    ListNode next = null;
 
    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if (head == null || k <= 0) {
            return null;
        }
        ListNode first = head, second = head;
        for (int i = 0; i < k - 1; i++) {
            if (first == null) break;
            first = first.next;
        }
        if (first == null) { // happens when k > length
            return null;
        }
        while (first.next != null) {
            first = first.next;
            second = second.next;
        }
        return second;
    }
}

 

 

 

0
1
分享到:
评论

相关推荐

    2009计算机考研题:查找链表中倒数第k个结点

    本题目的核心是查找链表中的倒数第k个节点,这是一个经典的链表问题,常见于面试和考研试题中。下面我们将深入探讨这个问题以及如何通过编程解决。 首先,链表是由一系列节点组成的数据结构,每个节点包含一个数据...

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

    在这个问题中,我们需要设计一个算法,给定一个链表的头节点和整数k,返回链表中倒数第k个节点。 首先,我们定义链表节点的数据结构。通常,链表节点包含两个部分:数据域和指针域。例如: ```cpp struct ListNode...

    C语言实现输出链表中倒数第k个节点

    在 `main` 函数中,我们先构建一个链表,然后调用 `print` 函数显示源链表,接着调用 `findKnode` 查找倒数第5个节点,并输出结果。测试用例包括空链表、正常链表(k小于等于链表长度)以及无效k值(k大于链表长度)...

    仅遍历一次得到链表的倒数第n个结点

    总的来说,解决"仅遍历一次得到链表的倒数第n个结点"的问题,需要理解和运用链表的特性和双指针技巧,这是一种在数据结构和算法面试中常见的问题,能够很好地考察候选人的逻辑思维和编程能力。在实际的编程练习中,...

    删除链表中倒数第N个结点

    在这个问题中,我们需要处理一个特殊的链表操作,即“删除链表中倒数第N个节点”。这个任务在C++编程中尤为常见,因为它涉及到基本的指针操作和算法设计。 链表由一系列节点组成,每个节点包含数据和指向下一个节点...

    取单链表倒数第k个元素

    处理单链表的问题时,有时我们需要找到链表中的特定位置的元素,例如“取单链表倒数第k个元素”这个问题。这个问题在面试中经常出现,因为它能够考察开发者对链表操作的理解和编程能力。 ### 算法描述 要找到...

    循环链表,双链表及链表应用

    在实验中,你需要设计一个算法来访问无头结点的单循环链表。这通常通过保持一个指针,并在每次迭代中移动它到下一个节点来实现。例如,你可以初始化一个指针到链表中的某个已知节点,然后不断更新指针直到再次回到...

    python实现获取单向链表倒数第k个结点的值示例

    本篇将详细讲解如何使用Python实现获取单向链表倒数第k个结点的值,并通过实例分析相关操作技巧。 首先,我们需要定义链表的节点类`Node`,它包含一个数据项`item`和一个指向下一个节点的引用`next`。节点的初始化...

    Python《剑指offer》算法实现-链表中倒数第k个结点

    1. 初级程序员注重算法和数据结构 2. 事先做好准备,对工作有热情 3. 面试过程放松。不要急于写代码,了解清楚所要解决的问题,多和面试官沟通,然后开始做一些整体的设计和规划。不要急于提交,自己测试几个用例避免错误...

    删除链表的倒数第 N 个结点(java代码).docx

    - `Solution` 类包含一个公共方法 `removeNthFromEnd`,该方法接受链表的头结点和一个整数 `n` 作为参数。 3. **快慢指针的初始化**: ```java ListNode dummy = new ListNode(0); dummy.next = head; ...

    java-leetcode题解之第19题删除链表的倒数第N个结点.zip

    总结来说,LeetCode第19题是一个关于链表操作的问题,主要考察对链表的遍历和删除操作的理解。通过双指针法,我们可以有效地找到并删除链表的倒数第N个节点。这个题目对于提升链表操作的技巧和理解非常重要,也是...

    c++-c++编程基础之leetcode题解第19题删除链表的倒数第N个结点.zip

    在C++编程中,LeetCode是一个非常受欢迎的在线平台,用于练习和提升算法技能。第19题,即“删除链表的倒数第N个节点”,是链表类问题中一个经典题目,旨在考察程序员对链表操作的理解以及如何在不遍历整个链表的情况...

    删除链表的倒数第 N 个结点.md

    删除链表的倒数第 N 个结点.md

    C#-Leetcode编程题解之第19题删除链表的倒数第N个结点.zip

    在本压缩包中,我们关注的是C#编程语言在解决LeetCode算法问题中的应用,特别是第19题——"删除链表的倒数第N个节点"。这是一道典型的链表操作题目,旨在考察程序员对链表结构的理解以及如何在单链表中进行高效的...

    java面试-leetcode面试题解之第19题删除链表的倒数第N个结点.zip

    最后,我们可以通过修改慢指针的前一个节点的next指针,将倒数第N个节点从链表中移除。 以下是这个问题的Java实现代码: ```java public class ListNode { int val; ListNode next; ListNode(int x) { val = x;...

    c语言-c语言编程基础之leetcode题解第19题删除链表的倒数第N个结点.zip

    在C语言中,链表是一种非常重要的数据结构,它由一系列节点组成,每个节点包含数据以及指向下一个节点的指针。本主题将深入探讨如何利用C语言解决LeetCode中的第19题——删除链表的倒数第N个节点。这道题目要求我们...

    查找倒数第N个结点(单链表)

    首先,我们要明确问题的要求:给定一个单链表的头节点和一个整数 n,我们需要找到链表中的倒数第 n 个节点。例如,如果链表为 1 -&gt; 2 -&gt; 3 -&gt; 4 -&gt; 5,且 n = 2,则目标节点是 4。 解决这个问题,我们可以采用双指...

Global site tag (gtag.js) - Google Analytics