题目:输入一个链表,输出该链表的倒数第K个节点。为了符合大多数人的习惯,本题从1开始计数,即链表尾节点是倒数第一个节点。 
解题思路:
解法一:一般情况下,单向链表无法从后一个节点获取到它前面的节点,可以通过两次遍历,第一次遍历获取链表中节点的个数,第二次遍历找到链表中第n-k+1个节点,就是链表的倒数第k个节点。
但是这种方法效率低,可以使用一次遍历得到倒数第K个节点
解法二:一次遍历得到倒数第K个节点。维护两个指针,第一个指针从链表头结点向前走k-1步,第二个节点指向头结点,从第K步开始,如果走在前面的节点有下一个节点,那两个节点一起向前走,
直到第一个节点走到尾节点,此时第二个节点指向倒数第K个节点
程序健壮性考虑:
1.输入链表为null 2.输入k为0或小于0 3.链表节点总数小于k
 package Solution;

 public class No15FindKthNodeFromEnd {

     public static class ListNode {
int data;
ListNode next; public ListNode(int value, ListNode next) {
this.data = value;
this.next = next;
}
} public static ListNode findKthNodeFromEnd(ListNode head, int k) {
if (head == null)
throw new RuntimeException("待查找的链表不能为空");
if (k <= 0)
throw new RuntimeException("输入的位置数字不合法");
ListNode ahead = head;
ListNode behind = head;
// 第一个指针先指向K-1,并检验链表中节点个数是否大于k
int count = 1;
for (int i = 0; i < k - 1; i++) {
if (ahead.next != null) {
ahead = ahead.next;
count++;
} else
throw new RuntimeException("链表节点个数:" + count + " 小于输入K的个数:" + k);
}
while (ahead.next != null) {
ahead = ahead.next;
behind = behind.next;
}
return behind;
} public static void main(String[] args) {
ListNode node1 = new ListNode(4, null);
ListNode node2 = new ListNode(3, node1);
ListNode node3 = new ListNode(2, node2);
ListNode head = new ListNode(1, node3);
ListNode find = findKthNodeFromEnd(head, 3);
System.out.println("找到的节点位" + find.data);
ListNode find2 = findKthNodeFromEnd(head, 5);
System.out.println("找到的节点位" + find2.data);
}
}

剑指offer面试题15:链表中倒数第K个节点的更多相关文章

  1. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  2. 剑指offer(14)链表中倒数第K个节点

    题目描述 输入一个链表,输出该链表中倒数第k个节点. 题目分析 用两个指针来跑,两个指针中间相距k-1个节点,第一个指针先跑,跑到了第k个节点时,第二个指针则是第一个节点. 这时候两个一起跑.当第一个 ...

  3. 剑指Offer - 九度1517 - 链表中倒数第k个结点

    剑指Offer - 九度1517 - 链表中倒数第k个结点2013-11-30 02:57 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含 ...

  4. 剑指offer十四之链表中倒数第k个结点

    一.题目 输入一个链表,输出该链表中倒数第k个结点. 二.思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点.然后两个指针同时往后移动,当第一个结 ...

  5. 【剑指Offer】14、链表中倒数第k个结点

      题目描述:   输入一个链表,输出该链表中倒数第k个结点.为了符合习惯,从1开始计数,即链表的尾结点是倒数第1个节点.例如,一个链表有6个结点,从头结点开始,它们的值依次是1,2,3,4,5,6. ...

  6. 剑指offer【13】- 链表中倒数第k个结点

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

  7. 面试题 15:链表中倒数第 k 个结点

    面试题 15:链表中倒数第 k 个结点 题目:输入一个链表,输出该链表中倒数第 k 个结点.为了符合大多数人的习惯, 本题从 1 开始计数,即链表的尾结点是倒数第一个结点.例如一个有 6 个结点的 链 ...

  8. 【剑指offer】面试题 22. 链表中倒数第 K 个节点

    面试题 22. 链表中倒数第 K 个节点

  9. 题目15 链表中倒数第K个节点

    ///////////////////////////////////////////////////////////////////////////////////// // 5. 题目15 链表中 ...

  10. 《剑指offer》面试题22. 链表中倒数第k个节点

    问题描述 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5. ...

随机推荐

  1. logistics回归理解

    多元回归方程:假设有一个因变量y和一组自变量x1, x2, x3, ... , xn,其中y为连续变量,我们可以拟合一个线性方程: y =β0 +β1*x1 +β2*x2 +β3*x3 +...+βn ...

  2. VBA读写ini 配置文件

    Option Explicit 'read Private Declare Function GetPrivateProfileString Lib "kernel32" Alia ...

  3. 查看 设置mysql时区

    # 查看时区 show variables like '%time_zone%'; system_time_zone CST time_zone SYSTEM # 设置全局 set global ti ...

  4. “XmlDocumentationProvider”不实现接口成员“IDocumentationProvider.GetDocumentation(HttpControllerDescriptor)”错误的解决方案

    这东西就是这样,会的不难,难的不会.以前我配置过 WebAPI 的 HelpPage 功能,第一步先安装:Microsoft.AspNet.WebAPi.HelpPage,第二步安装:WebApiTe ...

  5. java redispool测试类保存

    这两天睡眠不足,今晚吃完饭,肚子烦躁的很,迟迟进入不了代码的状态,强打精神,又赶上处理了几个编辑器的报错,等到真正面对问题的时候又是晚上十一点, 晚上十一点是幸运点,到这个点无关问题都能解决完毕进入调 ...

  6. java 得到项目路径

    JavaEXTTomcatJSPWeb 一 相对路径的获得  说明:相对路径(即不写明时候到底相对谁)均可通过以下方式获得(不论是一般的java项目还是web项目)  String relativel ...

  7. 服务管理之httpd

    目录 1. httpd简介 2. httpd版本 2.2 httpd-2.4新增的模块 3. httpd基础 3.1 httpd自带的工具程序 3.2 rpm包安装的httpd程序环境 3.3 web ...

  8. 第二阶段第十次spring会议

    昨天我对宠物信息进行了添加和调整. 今天我将继续对宠物信息添加保存按钮. private void button2_Click(object sender, EventArgs e) { Settin ...

  9. Jquery源码学习日记(1)

    https://jquery.com/  最新源码下载链接:jquery3.0 135-231定义了一些jquery的通用方法 233-301行定义了一些继承的方法 302-477定义了一些工具类方法 ...

  10. C++ openmp并行程序在多核linux上如何最大化使用cpu

    以上代码中,#pragma omp parallel for 这一行的作用即是调用openmp的功能,根据检测到的CPU核心数目,将for (i = 0; i < 1000000000; i++ ...