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个时候,第二个指针让他指向链表的第一个元素,然后这两个指针同时向后面移动, 当第一个指针移动到末尾的时候,第二个指针指 ...
随机推荐
- div嵌套引起的margin-top不起作用(转)
嵌套div中margin-top转移问题的解决办法在这两个浏览器中,有两个嵌套关系的div,如果外层div的父元素padding值为0,那么内层div的margin-top或者margin-botto ...
- HttpClient SSL示例(转)
原文地址: http://www.cnblogs.com/jerry19890622/p/4291053.html package com.jerry.httpclient; import java. ...
- mysql 拷贝表插入新的表
insert into table1 select * from table; insert into talble set name = value;
- Python urllib2 模块学习笔记
2015.3.6 urllib2的使用方法大致如下 # 定制Handler处理函数 opener = urllib2.build_opener(ProxyHandler, HTTPHandler) ...
- 深入理解jsavascript的作用域
一. JavaScript声明提前 在JavaScript中如果不创建变量,直接去使用,则报错: console.log(xxoo); // 报错:Uncaught ReferenceError: x ...
- 别让emacs损伤你的小母指
刚接触emacs时感觉,这东西怎么这么难用,还说是编辑器的神,我去. 写个代码跟挫游戏机手柄似的,关键是还这么难挫,平时用的最多的左ctrl键,这么难按,可怜的我的小母指(Petyr Baelish) ...
- Linux网络通信编程(套接字模型TCP\UDP与IO多路复用模型select\poll\epoll)
Linux下测试代码: http://www.linuxhowtos.org/C_C++/socket.htm TCP模型 //TCPClient.c #include<string.h> ...
- web.xml中JSP配置及 EL表达式
web.xml 中JSP配置.servlet配置 及 EL表达式 [摘要] servlet 基本配置 <servlet> <servlet-name>LoginServlet& ...
- Oracle设置表只读-alter table xxx read only
11g以前,当需要设置一个表只读时,我们通过赋予某些用户select权限.但对于表的owner来说,还是可以读写的. 从Oracle 11g开始,我们可以通过一下命令设置表只读或可读可写: alter ...
- 用于软件包管理的21个Linux YUM命令
FROM:http://os.51cto.com/art/201309/411895.htm YUM(Yellowdog Updater Modified)是一款开源命令行及图形化软件包管理工具,面向 ...