P107、面试题15:链表中倒数第K个结点
题目:输入一个链表,输出该链表中倒数第K个结点。为了符合大多数人的习惯,本体从1开始奇数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始他们的值一次是1、2、3、4、5、6.这个链表的倒数第3个结点是值为4的结点。
package com.yyq; /**
* Created by Administrator on 2015/9/13.
*/
public class FindKthToTail {
public static ListNode findKthToTail(ListNode pListHead, int k){
if(pListHead == null || k <= 0)
return null;
ListNode pAead = pListHead;
ListNode pBehind = null;
for(int i = 0; i < k-1; i++){
if (pAead.getM_pNext() != null)
pAead = pAead.getM_pNext();
else
return null;
}
pBehind = pListHead;
while(pAead.getM_pNext() != null){
pAead = pAead.getM_pNext();
pBehind = pBehind.getM_pNext();
}
return pBehind;
} public static void printList(ListNode pListHead){
if (pListHead == null)
return;
ListNode pNode = pListHead;
while(pNode!= null){
System.out.print(pNode.getM_nValue()+" ");
pNode = pNode.getM_pNext();
}
System.out.println();
} // ====================测试代码====================
// 测试要找的结点在链表中间
public static void Test1()
{
System.out.println("=====Test1 starts:=====");
ListNode pNode1 = new ListNode(1);
ListNode pNode2 = new ListNode(2);
ListNode pNode3 = new ListNode(3);
ListNode pNode4 = new ListNode(4);
ListNode pNode5 = new ListNode(5);
ListNode pNode6 = new ListNode(6); pNode1.setM_pNext(pNode2);
pNode2.setM_pNext(pNode3);
pNode3.setM_pNext(pNode4);
pNode4.setM_pNext(pNode5);
pNode5.setM_pNext(pNode6); System.out.println("List: ");
printList(pNode1);
ListNode pNode = findKthToTail(pNode1, 2);
if (pNode == null){
System.out.println("2th expected result is: " + pNode);
}else{
System.out.println("2th expected result is: " + pNode.getM_nValue());
}
System.out.println();
} // 测试要找的结点是链表的尾结点
public static void Test2()
{
System.out.println("=====Test2 starts:=====");
ListNode pNode1 = new ListNode(1);
ListNode pNode2 = new ListNode(2);
ListNode pNode3 = new ListNode(3);
ListNode pNode4 = new ListNode(4);
ListNode pNode5 = new ListNode(5);
ListNode pNode6 = new ListNode(6); pNode1.setM_pNext(pNode2);
pNode2.setM_pNext(pNode3);
pNode3.setM_pNext(pNode4);
pNode4.setM_pNext(pNode5);
pNode5.setM_pNext(pNode6); System.out.println("List: ");
printList(pNode1);
ListNode pNode = findKthToTail(pNode1, 1);
if (pNode == null){
System.out.println("1th expected result is: " + pNode);
}else{
System.out.println("1th expected result is: " + pNode.getM_nValue());
}
System.out.println();
} // 测试要找的结点是链表的头结点
public static void Test3() {
System.out.println("=====Test3 starts:=====");
ListNode pNode1 = new ListNode(1);
ListNode pNode2 = new ListNode(2);
ListNode pNode3 = new ListNode(3);
ListNode pNode4 = new ListNode(4);
ListNode pNode5 = new ListNode(5);
ListNode pNode6 = new ListNode(6); pNode1.setM_pNext(pNode2);
pNode2.setM_pNext(pNode3);
pNode3.setM_pNext(pNode4);
pNode4.setM_pNext(pNode5);
pNode5.setM_pNext(pNode6); System.out.println("List: ");
printList(pNode1);
ListNode pNode = findKthToTail(pNode1, 6);
if (pNode == null) {
System.out.println("6th expected result is: " + pNode);
} else {
System.out.println("6th expected result is: " + pNode.getM_nValue());
}
System.out.println();
} // 测试空链表
public static void Test4()
{
System.out.println("=====Test4 starts:=====");
ListNode pNode = findKthToTail(null, 100);
if (pNode == null) {
System.out.println("100th expected result is: " + pNode);
} else {
System.out.println("100th expected result is: " + pNode.getM_nValue());
}
System.out.println();
} // 测试输入的第二个参数大于链表的结点总数
public static void Test5()
{
System.out.println("=====Test5 starts:=====");
ListNode pNode1 = new ListNode(1);
ListNode pNode2 = new ListNode(2);
ListNode pNode3 = new ListNode(3);
ListNode pNode4 = new ListNode(4);
ListNode pNode5 = new ListNode(5);
ListNode pNode6 = new ListNode(6); pNode1.setM_pNext(pNode2);
pNode2.setM_pNext(pNode3);
pNode3.setM_pNext(pNode4);
pNode4.setM_pNext(pNode5);
pNode5.setM_pNext(pNode6); System.out.println("List: ");
printList(pNode1);
ListNode pNode = findKthToTail(pNode1, 7);
if (pNode == null) {
System.out.println("7th expected result is: " + pNode);
} else {
System.out.println("7th expected result is: " + pNode.getM_nValue());
}
System.out.println();
} // 测试输入的第二个参数为0
public static void Test6()
{
System.out.println("=====Test6 starts:=====");
ListNode pNode1 = new ListNode(1);
ListNode pNode2 = new ListNode(2);
ListNode pNode3 = new ListNode(3);
ListNode pNode4 = new ListNode(4);
ListNode pNode5 = new ListNode(5);
ListNode pNode6 = new ListNode(6); pNode1.setM_pNext(pNode2);
pNode2.setM_pNext(pNode3);
pNode3.setM_pNext(pNode4);
pNode4.setM_pNext(pNode5);
pNode5.setM_pNext(pNode6); System.out.println("List: ");
printList(pNode1);
ListNode pNode = findKthToTail(pNode1, 0);
if (pNode == null) {
System.out.println("0th expected result is: " + pNode);
} else {
System.out.println("0th expected result is: " + pNode.getM_nValue());
}
System.out.println();
} public static void main(String[] args) {
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
}
}
P107、面试题15:链表中倒数第K个结点的更多相关文章
- 面试题 15:链表中倒数第 k 个结点
面试题 15:链表中倒数第 k 个结点 题目:输入一个链表,输出该链表中倒数第 k 个结点.为了符合大多数人的习惯, 本题从 1 开始计数,即链表的尾结点是倒数第一个结点.例如一个有 6 个结点的 链 ...
- 剑指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 ...
- 面试题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个时候,第二个指针让他指向链表的第一个元素,然后这两个指针同时向后面移动, 当第一个指针移动到末尾的时候,第二个指针指 ...
随机推荐
- Maven Dependency Scope用法
原帖地址:http://uule.iteye.com/blog/2087485 官方API描述 Dependency scope 是用来限制Dependency的作用范围的, 影响maven项目在各个 ...
- Traveller项目介绍
Traveller,翻译为旅行家,是我用来实践最佳web技术的项目,主题是一个给旅行爱好者提供旅行信息的网站. 目标是组合现最流行的web技术,实现符合中国用户使用习惯的网站. 相关网址 Git:ht ...
- 对.Net WebSocket 和Socket的原理的思考
今早上班路上接到了一个朋友的微信信息,问我对WebSocket 是否熟悉,一楞,印象之中没有用过这个类....来到公司后,得空问了一下度娘,原来这是一个随着HTML5推出的一种新协议,意义在于能实现浏 ...
- PHPExcel读取excel03/07版到数组
想总结下PHPExcel的读取excel到数组的function,用的时候直接调取,懒…… 参考了以下链接: http://www.jb51.net/article/29071.htm http:// ...
- APACHE支持.htaccess以及 No input file specified解决方案
在你的Apache安装文件夹conf里找到httpd.conf文件 搜索LoadModule rewrite_module modules/mod_rewrite.so 如果前面有注释符号#,请去掉. ...
- linux 输入子系统(4)---- input子系统的初始化
Input子系统的初始化函数为input_init(),如下: static int __init input_init(void) { int err; input_init_abs_bypass( ...
- C++ STL中迭代器失效的问题
my_container.erase(iter); 其中my_container是STL的某种容器,iter是指向这个容器中某个元素的迭代器.如果不是在for,while循环中,这种方式删除元素没有问 ...
- 《WPF程序设计指南》读书笔记——第1章 应用程序与窗口
1.空白WPF项目的创建: 1)新建项目:在VS2010中,文件-新建-项目-visual c#-windows-空项目: 2)添加引用:PresentationFramework,Presentat ...
- 1087. All Roads Lead to Rome (30)
时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Indeed there are many different ...
- MongoDB 日期 插入时少8小时
存储在mongodb中的时间是标准时间UTC +0:00 而咱们中国的失去是+8.00 . C#的驱动支持一个特性,将实体的时间属性上添加上这个特性并指时区就可以了.例如:[BsonDateTime ...