当前位置: 首页 > 编程笔记 >

Java输出链表倒数第k个节点

欧阳俊逸
2023-03-14
本文向大家介绍Java输出链表倒数第k个节点,包括了Java输出链表倒数第k个节点的使用技巧和注意事项,需要的朋友参考一下

问题描述

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

结点定义如下:

public class ListNode {
  int val;
  ListNode next = null;

  ListNode(int val) {
    this.val = val;
  }
}

思路1:

先遍历链表,计算其长度length;
然后计算出倒数第k个结点就是正数第length - k + 1.
最后再遍历链表,找到所求结点
时间复杂度O(2n),需要遍历两次链表

代码如下:

public ListNode FindKthToTail(ListNode head,int k) {
    if(head == null || k <= 0){
      return null;
    }
    //直接遍历
    ListNode p = head;
    int length = 1;
    while(p.next != null){
      length++;
      p = p.next;
    }
    int index = length - k + 1;
    if(index <= 0){
      return null;
    }
    p = head;
    int num = 1;
    while(p.next != null && num < index){
      num++;
      p = p.next;
    }
    if(num < index){
      return null;
    }else{
      return p;
    }
  }

思路2:

期待只遍历链表一次就能得到。
设置两个指针,一个初始化指向第一个结点,第二个指向第k个结点。然后两个指针同步向后移动,当第二个指向尾结点时,第一个指针即指向了倒数第k个结点

代码:

public ListNode FindKthToTail(ListNode head,int k) {
    if(head == null || k <= 0){
      return null;
    }
    //直接遍历
    ListNode p = head;
    ListNode q = head;
    for(int i = 0; i < k-1; i++){
      if(q == null){
        return null;
      }
      q = q.next;
    }
    if(q == null){
      return null;
    }
    while(q.next != null){
      p = p.next;
      q = q.next;
    }
    return p;
  }

思路3:

将链表反转,那么原问题就变为求正数第k个结点。
然而这改变了原本的链表,且并不会比思路2更高效

链表反转:参考《Java语言实现反转链表代码示例》

总结

以上就是本文关于Java输出链表倒数第k个节点的全部内容,感兴趣的朋友可以继续参阅:Java编程删除链表中重复的节点问题解决思路及源码分享、Java编程实现从尾到头打印链表代码实例以及本站其他相关专题,如有不足之处,欢迎留言指出,小编一定及时更正,给大家更好的阅读体验和帮助,感谢朋友们对本站的支持!

 类似资料:
  • 本文向大家介绍C语言实现输出链表中倒数第k个节点,包括了C语言实现输出链表中倒数第k个节点的使用技巧和注意事项,需要的朋友参考一下 本文实例展示了C++实现输出链表中倒数第k个节点的方法,分享给大家供大家参考之用。 运行本文所述实例可实现输入一个单向链表,输出该链表中倒数第k个节点。 具体实现方法如下: 测试用例如下: 1. NULL Link     head = NULL; 2. normal

  • 一、题目 输入一个链表,输出该链表中倒数第k 个结点。为了符合大多数人的习惯,本题从1 开始计数,即链表的尾结点是倒数第1 个结点.例如一个链表有6 个结点,从头结点开始它们的值依次是1 、2、3、4、5 、6。这个个链表的倒数第3 个结点是值为4 的结点。 二、解题思路 为了实现只遍历链表一次就能找到倒数第k 个结点,我们可以定义两个指针。第一个指针从链表的头指针开始遍历向前走k-1步,第二个指

  • NowCoder 解题思路 设链表的长度为 N。设置两个指针 P1 和 P2,先让 P1 移动 K 个节点,则还有 N - K 个节点可以移动。此时让 P1 和 P2 同时移动,可以知道当 P1 移动到链表结尾时,P2 移动到第 N - K 个节点处,该位置就是倒数第 K 个节点。 // java public ListNode FindKthToTail(ListNode head, int k

  • 本文向大家介绍PHP获取链表中倒数第K个节点的方法,包括了PHP获取链表中倒数第K个节点的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP获取链表中倒数第K个节点的方法。分享给大家供大家参考,具体如下: 问题 输入一个链表,输出该链表中倒数第k个结点。 解决思路 注意这个题目是返回节点,而不是返回值。返回值的话可以用栈来存储。返回节点则不能这样做。 设置两个指针,先让第一个指针移

  • 本文向大家介绍C++实现单链表删除倒数第k个节点的方法,包括了C++实现单链表删除倒数第k个节点的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++实现单链表删除倒数第k个节点的方法。分享给大家供大家参考,具体如下: 题目: 删除单链表中倒数第k个节点 解题思路及算法代码: 标尺法,定义两个指针指向链表头结点,先让一个走k步,然后两个指针同时开始走,当先走的指针走到末尾时,后走的指

  • 本文向大家介绍java输入数字,输出倒序的实例,包括了java输入数字,输出倒序的实例的使用技巧和注意事项,需要的朋友参考一下 我就废话不多说了,大家还是直接看代码吧~ 控制台效果显示: 补充知识:Java实现整数的逆序输出(三种方法) Java实现整数的逆序输出和C语言相似。下面我介绍三种方法。 第一种:无限制整数的逆序输出。 第二种:非负整数的逆序输出(结果String化)。 第三种:非特殊情