剑指offer面试题15:链表中倒数第K个节点
题目:输入一个链表,输出该链表的倒数第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个节点的更多相关文章
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 剑指offer(14)链表中倒数第K个节点
题目描述 输入一个链表,输出该链表中倒数第k个节点. 题目分析 用两个指针来跑,两个指针中间相距k-1个节点,第一个指针先跑,跑到了第k个节点时,第二个指针则是第一个节点. 这时候两个一起跑.当第一个 ...
- 剑指Offer - 九度1517 - 链表中倒数第k个结点
剑指Offer - 九度1517 - 链表中倒数第k个结点2013-11-30 02:57 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含 ...
- 剑指offer十四之链表中倒数第k个结点
一.题目 输入一个链表,输出该链表中倒数第k个结点. 二.思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点.然后两个指针同时往后移动,当第一个结 ...
- 【剑指Offer】14、链表中倒数第k个结点
题目描述: 输入一个链表,输出该链表中倒数第k个结点.为了符合习惯,从1开始计数,即链表的尾结点是倒数第1个节点.例如,一个链表有6个结点,从头结点开始,它们的值依次是1,2,3,4,5,6. ...
- 剑指offer【13】- 链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点. /* public class ListNode { int val; ListNode next = null; ListNode(int val) { ...
- 面试题 15:链表中倒数第 k 个结点
面试题 15:链表中倒数第 k 个结点 题目:输入一个链表,输出该链表中倒数第 k 个结点.为了符合大多数人的习惯, 本题从 1 开始计数,即链表的尾结点是倒数第一个结点.例如一个有 6 个结点的 链 ...
- 【剑指offer】面试题 22. 链表中倒数第 K 个节点
面试题 22. 链表中倒数第 K 个节点
- 题目15 链表中倒数第K个节点
///////////////////////////////////////////////////////////////////////////////////// // 5. 题目15 链表中 ...
- 《剑指offer》面试题22. 链表中倒数第k个节点
问题描述 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5. ...
随机推荐
- 关于easyui框架中a标签使用onclick()触发事件偶尔会选项卡消失BUG解决方案
今天发现公司的一个easyui项目中有个页面会在触发onclick事件时选项卡消失,如下图 产生BUG后 产生BUG前 查找很多地方还有资料不知道哪里出现的问题,看了下框架源码之类的,因为不是专门的前 ...
- Android Studio 的 build 过程
如图, 编译器将源代码(包括 Application Module 及其所依赖的所有 Library 源代码)转换成 DEX(Dalvik Executable)文件(其中包括运行在 Android ...
- 《Java从入门到精通》学习总结1
1. Java既是编译型语音,也是解释型语言:先将源代码编译成Java字节码,然后Java虚拟机对Java字节码进行解释运行 2. 使用命令行编译Java源代码时,如果代码中有中文,在编译时需要指定编 ...
- functools 之 partial(偏函数)
当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单.当然,decorator(装饰器) 也可以实现, ...
- 纯css3单选框/复选框美化样式代码
纯CSS 单/复选框 美化请选择iPhone 型号 iPhone 6s iPhone 6s Plus iPhone 7 iPhone 7 Plus 选择兴趣爱好 女 绘画 摄影 骑行 原理在这 ...
- MVC4 decimal 精度
MVC默认为小数点 后2位 更改设置 在我们现在的MovieDBContext类中重载OnModelCreating方法,代码如下所示.public class MovieDBContext : Db ...
- centos 添加右键在终端打开
yum -y install nautilus-open-terminal
- python-常见用法
一.注释 单行注释:#后全部注释 多行注释:'''所有内容''' 或者使用 """所有内容""" ,多行注释用三对单引号或双引号包裹 二 ...
- Isight Linux 2016hf2 安装步骤
把License文件整个拷进去,都给执行权限 把ABAQUS.lic 里的 this_host 改为psn004 27011 改为26011 (区别于2017hf2) 杀掉2017的server ./ ...
- jqgrid content-type datatype
jQuery('#jq2').jqGrid( { url: 'http://localhost:8080/api/RskPriceFactorTest/senario/0/detail', editu ...