面试题 15:链表中倒数第 k 个结点
面试题 15:链表中倒数第 k 个结点
题目:输入一个链表,输出该链表中倒数第 k 个结点。为了符合大多数人的习惯, 本题从 1 开始计数,即链表的尾结点是倒数第一个结点。例如一个有 6 个结点的 链表,从头结点依次是 1,2,3,4,5,6。倒数第三个结点就是值为 4 的结点。
最初思路:先遍历链表得到链表总长度,然后length-k+1位置的结点就是所求结点。但是需要遍历两遍
改进:用两个指针,两个指针之间距离相差k-1;当第一个指针都到链表尾结点,那么第二个指针就在倒数第k
注意程序的鲁棒性:
链表为空链表,返回null;
k=0,返回空;
k大于链表长度,返回null;
package offer;
/*面试题 15:链表中倒数第 k 个结点
题目:输入一个链表,输出该链表中倒数第 k 个结点。为了符合大多数人的习惯, 本题从 1 开始计数,即链表的尾结点是倒数第一个结点。
例如一个有 6 个结点的 链表,从头结点依次是 1,2,3,4,5,6。倒数第三个结点就是值为 4 的结点。
*/
public class Problem15 { public static void main(String[] args) {
ListNode node1 = new ListNode();
ListNode node2 = new ListNode();
ListNode node3 = new ListNode();
ListNode node4 = new ListNode();
node1.value = 1;
node2.value = 2;
node3.value = 3;
node4.value = 4;
node1.nextNode = node2;
node2.nextNode = node3;
node3.nextNode = node4;
Problem15 test = new Problem15();
ListNode result = test.getNode(node1, 1);
System.out.println(result.value);
}
public ListNode getNode(ListNode head,int k){
if(head == null || k <= 0){return null;}
ListNode temp = head;
for(int i=0; i<k; i++){
//第一个结点先走k步,两个结点相差k-1
if(temp.nextNode!=null)
temp = temp.nextNode;
else return null;//链表长度小于k
}
ListNode result = head;
while(temp!=null)
{
temp = temp.nextNode;
result = result.nextNode;
}
return result;
} }
同类题目:
1:求链表的中间结点。如果链表中结点总数为奇数,返回中间结点;如果结点总数为偶数,返回中间两个结点任意一个结点。
--同样吗,可以定义两个指针,同时从链表头结点出发,一个指针一次走一步,另一个指针一次走两步,当走的快的结点到达末尾,
慢点的结点刚好在中间。
2:判断一个单链表是否形成了环形结构。两个指针同上,如果快指针追上了慢指针,则是环形结构,否则不是。(走到了链表的末尾)
面试题 15:链表中倒数第 k 个结点的更多相关文章
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 剑指offer-面试题15.链表中倒数第k个结点
题目:输入一个链表,输出该链表的倒数第K个结点.为了符合大多数人的习惯,本题 从1开始计数,即链表的尾结点是倒数第1个节点.例如有一个链表有6个节点,从 头节点开始他们的值依次是1,2,3,4,5,6 ...
- 15 链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点. p1先走k-1步,p1 p2再一起走 C++: /* struct ListNode { int val; struct ListNode *next; L ...
- 面试题一 链表中倒数第k个结点
void findLastK(LinkedNode head, int k, int n){ if (head == NULL || k == 0) return; LinkedNode t1 = h ...
- (剑指Offer)面试题15:链表中倒数第k个结点
题目: 输入一个链表,输出该链表中倒数第k个结点. 例如:链表中有6个结点,从头到尾依次为1,2,3,4,5,6,则该链表的倒数第3个结点为4. 链表结点定义: struct ListNode{ in ...
- P107、面试题15:链表中倒数第K个结点
题目:输入一个链表,输出该链表中倒数第K个结点.为了符合大多数人的习惯,本体从1开始奇数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点,从头结点开始他们的值一次是1.2.3.4.5.6.这个 ...
- 面试题15:链表中倒数第K个结点
输入一个链表,输出该链表中倒数第k个结点. 方法1: 这个解法要循环两次链表 /* public class ListNode { int val; ListNode next = null; Lis ...
- 剑指Offer面试题15(Java版):链表中倒数第K个结点
题目: 输入一个链表.输出该链表中倒数第k哥结点. 为了符合大多数人的习惯,本题从1開始计数.即链表的尾结点是倒数第1个结点. 比如一个链表有6个结点.从头结点開始它们的值依次是1.2.3,4,5, ...
- 【面试题015】链表中倒数第k个结点
[面试题015]链表中倒数第k个结点 可以用两个指针,当第一个指针指向了第k个时候,第二个指针让他指向链表的第一个元素,然后这两个指针同时向后面移动, 当第一个指针移动到末尾的时候,第二个指针指 ...
随机推荐
- 【14】redux 之 redux-actions
redux-actions有两大法宝createAction和handleActions. createAction http://www.jianshu.com/p/6ba5cd795077 原来创 ...
- 分裂游戏(bzoj 1188)
Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...
- URLRewrite出现的CSS及图片路径问题
原文发布时间为:2011-02-24 -- 来源于本人的百度文章 [由搬家工具导入] 例如:把http://www.sofunz.com/house/18649重写到http://www.sofunz ...
- duilib入门简明教程 -- 部分bug (11) (转)
原文转自:http://www.cnblogs.com/Alberl/p/3344886.html 一.WindowImplBase的bug 在第8个教程[2013 duilib入门简明教程 ...
- 关于ping以及TTL的分析【转】
转自:http://blog.csdn.net/u013451221/article/details/46608881 首先介绍一下ping这个工具 ping [目标] 的意思就是向目标发送几个数据包 ...
- Oracle SQL优化进阶学习
引言 对于下面的Oracle分页如何优化该段语句: SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM task_log order by ...
- hdu 4519(数学题)
郑厂长系列故事——体检 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total S ...
- hdu 2145(迪杰斯特拉)
zz's Mysterious Present Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- nodejs递归创建目录
var fs = require("fs"); var path = require("path"); // 递归创建目录 异步方法 function mkdi ...
- AC日记——中庸之道 codevs 2021
2021 中庸之道 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 给定一个长度为N的序列 ...