面试题 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个时候,第二个指针让他指向链表的第一个元素,然后这两个指针同时向后面移动, 当第一个指针移动到末尾的时候,第二个指针指 ...
随机推荐
- DFA Minimization
有点晚了我就不调试了..不过说是这么说我还是过了编译的.. #include<bits/stdc++.h> using namespace std; namespace DFA{ cons ...
- 汇编中的 imul 指令
1.这是整形乘法指令,无论是 unsigned int 还算是 signed int 实际上指令都是进行相同的运算,只不过最终的结果是由程序中的类型来做相应的解读 2.imul 指令实际上不会发生 o ...
- POJ3687 Labeling Balls
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13645 Accepted: 3955 Description Wind ...
- Page_Load与Page_PreRender的执行顺序
原文发布时间为:2009-10-25 -- 来源于本人的百度文章 [由搬家工具导入] Page_PreRender 服务器控件将要呈现给其包含的 控件时发生。简单的理解为page中的控件渲染调用此事件 ...
- Iframe载入页面 及 跳转页面
原文发布时间为:2009-05-05 -- 来源于本人的百度文章 [由搬家工具导入] 第一个文件 frame1.html <!DOCTYPE html PUBLIC "-//W3C// ...
- gridview行链接
原文发布时间为:2009-04-21 -- 来源于本人的百度文章 [由搬家工具导入] 点击行,链接!! 可这样,在GridView的RowDataBound输入代码,假如id在第0列,且不是摸板列: ...
- Some lines about EF Code First migration.
Some lines about EF Code First migration: 一. 模型设计 1. 遵循EF标准,注意表关系配对 2. 数据模型里尽量把必须的属性和说明都写全 3. EF默认id ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---54
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- 转:[小北De编程手记] : Selenium For C# 教程目录
写<Selnium For C#>系列文章的初衷是因为有很多朋友问我应该从哪里开始学习自动化测试,于是就为大家写下了这个系列的文章,希望对你有些帮助吧.而我想表达的是Selenium(同时 ...
- javascript 省市二级联动
通过遍历二维数组 获取到 二级列表的 每个option 然后onchange事件 获取到省,然后循环遍历该省具有的市并将遍历到的市添加到id为city的选择器中. 获取完需要清空二级列表的内容,不然不 ...