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

华为OD机试 - 输出单向链表倒数第k个结点 - 双指针(Java 2024 B卷 100分) 每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。 阅读详情

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

思路一:首先我们可以想到的是遍历完整个链表然后从尾部回溯k个节点就能找到,但是单向链表不能从尾部向前遍历。这时,我们就可以想到先遍历一遍计算出总共的结点个数count,然后再从头部开始遍历到count-k,就能取到倒数第k个结点了。这个方法之间复杂度虽然为O(n),但是遍历了两次链表,对于结点个数不多的链表来说适用,但是数据量太大的话就比较影响效率了。

测试代码:

public T find(int k){
    int count = 0;//统计结点个数
    Entry<T> cur = this.head;
    while (this.head != null){
        count++;
        cur = cur.next;
    }

    for (int i = 0; i <= count - k ; i++) {
        cur = cur.next;
    }
    return cur.data;
}

思路二:为了在数据量较大的情况下不影响效率,这时我们应该想到怎么样遍历一次链表就取到要找的值。这时我们可以想到利用快慢指针可以达到目的。定义两个指针,慢指针比快指针慢上k个结点,这样当快指针遍历到尾部时,慢指针就刚好指向倒数第k个结点。这样很好的提高了效率,只遍历了一次链表。

测试代码:

public T find(int k){
    Entry<T> fast = this.head;
    Entry<T> slow = this.head.next;
    for (int i = 0; i < k; i++) {//先让快指针指向正数第k个结点
        fast = fast.next;
        if (fast == null){//如果链表长度小于k
            return null;
        }
    }
    
    while (fast.next != null){//当快指针走到尾部时,慢指针刚好指向倒数第k个结点
        fast = fast.next;
        slow = slow.next;
    }
    return slow.data;
}

 

如何在华为OD机试中获得满分?Java实现【输出单向链表倒数第k个结点】一文详解! ✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 输入一个单向链表输出链表倒数第k个结点链表倒数第1个结点链表的尾指针。链表结点定义如下: 正常返回倒数第k个结点指针,异常返回空指针。要求:数据范围:链表长度满足 1≤n≤1000 ,k≤n ,链表中数据满足 0≤val≤10000 。输出一个整数。 5. 测试 阅读详情

相关推荐

【华为机试真题详解JAVA实现】—输出单向链表倒数第k个结点

数据范围:链表长度满足1≤n≤1000 ,链表中数据满足 0≤val≤10000。输入一个单向链表输出链表倒数第k个结点链表倒数第1个结点链表的尾指针。正常返回倒数第k个结点指针,异常返回空指针.1 、输入链表结点个数。本题有多组样例输入

猿小白的博客 430

数据结构-输出单链表倒数第K个结点

【问题描述】输入一个单向链表输出链表倒数第k个结点链表的最后一个结点倒数第1个节点。【输入形式】输入第一位为K值,其后接一串以空格分隔的整型值,输入-1时停止建立链表。【样例说明】K值为3,则输出链表倒数第3个结点的值,为4;数据输入间以空格隔开。【输出形式】输出倒数第K个结点的值,若无,则输出Not Found。【样例输入】3 13 45 54 32 1 4 98 2 -1。

m0_63581095的博客 2906

程序员面试题精选(9):查找链表倒数第k个结点

题目:输入一个单向链表输出链表倒数第k个结点链表倒数第0个结点链表的尾指针。链表结点定义如下:struct ListNode{      int       m_nKey;      ListNode* m_pNext;};分析:为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针。因此我们需要打

yysdsyl的专栏 2571

输入一个单向链表输出倒数第k个结点

分析: 1、一个单向的带

SilenceCarrot的专栏 1288

今天开始学Java 输入一个单向链表输出链表倒数第k个结点链表倒数第1个结点链表的尾指针。

题目描述输入一个单向链表输出链表倒数第k个结点链表倒数第1个结点链表的尾指针。链表结点定义如下:struct ListNode{      int       m_nKey;      ListNode* m_pNext;};详细描述:接口说明原型:ListNode* FindKthToTail(ListNode* pListHead, unsignedint k);输入参数:    ...

u014566193的博客 2072

[java 面试100道]13.输入一个单向链表输出链表倒数第k个结点

题目:输入一个单向链表输出链表倒数第k个结点链表倒数第0个结点链表的尾指针。 链表结点定义如下:   class ListNode{ int key; ListNode next; public ListNode(int key){ this.key=key; } } public class LastK { public ListNode getLastK(Lis

stonetudou的专栏 2867

java链表输出_[java 面试100道]13.输入一个单向链表输出链表倒数第k个结点。...

题目:输入一个单向链表输出链表倒数第k个结点链表倒数第0个结点链表的尾指针。链表结点定义如下:class ListNode{int key;ListNode next;public ListNode(int key){this.key=key;}}public class LastK {public ListNode getLastK(ListNode head,int k){if(k...

weixin_28952383的博客 308

Java输入一个链表输出链表倒数第k个结点

定义两个引用fast和slow,先让fast走k-1步, 然后和slow一起每次走一步直到fast到达末尾结点, 此时slow位于倒数第k个结点。 public Node FindKthToTail(Node head,int k) { if(head == null) { return null; } Node cu...

yufy0528的博客 362

java:输入一个链表输出链表倒数第k个结点

public class ListNode { int val; ListNode next; public ListNode(int val) { this.val = val; } } public class Solution { //计算链表的长度 public int size(ListNode head){ int size = 0; //遍历链表,获取长度 for (Lis...

以梦为马&不负韶华的博客 410

HJ51 输出单向链表倒数第k个结点java代码实现)

输入一个单向链表输出链表倒数第k个结点链表倒数第1个结点链表的尾指针。 链表结点定义如下: struct ListNode { int m_nKey; ListNode m_pNext; }; 正常返回倒数第k个结点指针,异常返回空指针 数据范围:链表长度满足 1 \le n \le 1000 \1≤n≤1000 , k \le n \k≤n ,链表中数据满足 0 \le val \le 10000 \0≤val≤10000 本题有多组样例输入输入描述: 输入说明 1 输入

weixin_46494166的博客 816

刷题java剑指,输入一个链表输出链表倒数第k个结点

刷题java剑指,输入一个链表输出链表倒数第k个结点代码1类似题目:链表中的节点总数为奇数,则返回中间节点,节点总数偶数返回中间节点的任意一个。代码2 题目:输入一个链表输出链表倒数第k个节点。 方法:1)遍历两次。第一次遍历出链表长度n,第二次遍历正向输出链表第n-k+1个节点就是所求节点。 2)遍历一次。设置两个指针,一个指针先走到k-1节点,第二个指针开始一起遍历。当第一个指针到...

ziyouputao的博客 211

输入一个链表输出链表倒数第k个结点--java实现

输入一个链表输出链表倒数第k个结点 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode FindKthToT...

qq_44330050的博客 224

剑指offer——14、输入一个链表输出链表倒数第k个结点。(java

题目 输入一个链表输出链表倒数第k个结点。 解法 一共可以有三个解法思路。 (1)循环一遍链表得到链表长度length,之后再次循环定位倒数第k个元素。 (2)从第一个节点开始遍历,每次都只遍历k个元素,如果第k个元素的next是null,则得到了倒数第k个。 (3)第三种就是下面这种,前后两个指针,两个指针之间的长度为k,当前指针到链表尾部的时候,后指针指向的就是倒数第k个。(最优) pu...

weixin_42924812的博客 232

13.输入一个单向链表输出链表倒数第k个结点链表倒数第0个结点链表的尾指针

问题: 输入一个单向链表输出链表倒数第k个结点链表倒数第0个结点链表的尾指针 答案: //20130112#include using namespace std; typedef struct node { int n; node* next; }node,*pnode; int main() { int a[14]={6,7,8,9,2,3,5,6,7,8,

zhoutong12589的专栏 715

华为-输出单链表倒数第k个结点

java实现) 题目描述: 输入一个单向链表输出链表倒数第k个结点链表倒数第1个结点链表的尾指针。 链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 正常返回倒数第k个结点指针,异常返回空指针 本题有多组样例输入输入描述: 输入说明 1 输入链表结点个数 2 输入链表的值 3 输入k的值 输出描述: 输出一个整数 示例1: 输入 8 1 2 3 4 5 6 7 8 4 输出 5 问题分析: 思

u012449521的博客 264

Java数据结构与算法(剑指offer)——输入一个链表输出链表倒数第k个结点

思路: 1. 编写一个方法,接收head节点,同时接收一个index 2. index表示是倒数第index个节点 3. 先把链表从头到尾遍历,得到链表的总的长度getLength 4. 得到size后,我们从链表的第-一个开始遍历(size-index)个, 就可以得到倒数第k个节点 5. 如果找到了,则返回该节点,否则返回nulll /* public class ListNode { int val; ListNode next = null; ListNode(int va

qq_44802992的博客 220

题目:输入一个单向链表输出链表倒数第k个结点链表倒数第0个结点链表的尾指针。...

题目:输入一个单向链表输出链表倒数第k个结点链表倒数第0个结点链表的尾指针。链表结点定义如下: struct ListNode{ int m_nKey; ListNode* m_pNext;}; C# codes as below: using System; using System.Collections.Generic; namespace ConsoleA...

javatome 156

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

class Node { public int data; public Node next; //存储对象引用 public Node(int data) { this.data = data; //没有初始化next的引用,不知道next当前指向哪个节点 } } public class SingleList { public Node head;//定位头节点的引用 public void addFirst(int data)

yanweiding的博客 158
上一篇: java-给一个数组,实现奇数在前,偶数在后的排序三种解法
下一篇: java-二叉树的四种遍历的递归与非递归实现
Ucsasuke
博客等级 码龄7年 24粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值