面试题 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个时候,第二个指针让他指向链表的第一个元素,然后这两个指针同时向后面移动, 当第一个指针移动到末尾的时候,第二个指针指 ...
随机推荐
- JS 监听绑定和取消事件
1. 原生 JS 语言: 绑定:addEventListener(type, function, false) 取消: removeEventListener(type, function, fals ...
- react当中子组件改变父组件的状态
子组件直接改变父组件传入的props值是不被允许的, 当需要在子组件当中改变父组件的某一个状态, 父组件传入一个改变状态的函数,然后在子组件当中调用函数即可
- 关于fixed定位的一些错误看法纠正
之前由于一些误导,一直感觉fixed这个定位在ie8下面是会出现兼容问题的,今天发现这个想法太绝对了,它只是在ie7 8 的怪异模式下面会出现兼容问题 解决这个问题可以通过用absolute来模拟fi ...
- Xcode打包和生成ipa文件
1.生成Archive文档 a) 需将左上角红色方框里的设备类型选为ios device,不能选择具体的设备类型,否则不能生成Archive文档: b) 中部选择Team的方框,可此时选,也在后续ex ...
- 【Linux】自主实现my_sleep【转】
转自:http://blog.csdn.net/scenlyf/article/details/52068522 版权声明:本文为博主原创文章,未经博主允许不得转载. 首先说一下信号相关的内容. ** ...
- DNS解析过程详解【转】
转自:http://blog.chinaunix.net/uid-28216282-id-3757849.html 先说一下DNS的几个基本概念: 一. 根域 就是所谓的“.”,其实我们的网址www. ...
- Python学习杂记_8_从程序外部传参的办法sys.argv
Python用 sys.argv[] 实现从程序外部传参 “外部”的含义,其实就是这些参数不是你在程序中定义的,而是在程序之外通过输入操作传递进来的.sys.argv 会返回一个元组,元组的首个元素即 ...
- C++ 找不到方法标识符
其实原因是这个CPP并没有面向对象的结构. 所以进行编译时是“顺序编译”的,而main函数的定义又在A的定义之前.自然找不到标识符了.
- AC日记——传染病控制 洛谷 P1041
传染病控制 思路: 题目想问的是: 有一棵树: 对于除1外每个深度可以剪掉一棵子树: 问最后剩下多少节点: 题目意思一简单,这个题立马就变水了: 搜索就能ac: 数据有为链的情况,按深度为层次搜索的话 ...
- 任意选若干个不相邻的数得到的和最大【dp】
非相邻数最大和 ///*任意选若干个不相邻的数得到的和最大*/ #include<cstdio> #include<cstring> #include<queue> ...