题目:输入一个链表,输出该链表中倒数第K个结点。为了符合大多数人的习惯,本体从1开始奇数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始他们的值一次是1、2、3、4、5、6.这个链表的倒数第3个结点是值为4的结点。

思路:先是一个指针往前走,走了k步之后,前后指针一起走,但是要注意特殊情景。
 
测试用例:
1)功能测试(第k个结点在链表的中间,第k个结点是链表的头结点,第k个结点是链表的尾结点);
2)特殊输入测试(链表头结点为null指针,链表的结点总数少于k,k等于0)。
 
代码实现:
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();
}
}
 
输出结果:
=====Test1 starts:=====
List: 
1  2  3  4  5  6  
2th expected result is: 5
 
=====Test2 starts:=====
List: 
1  2  3  4  5  6  
1th expected result is: 6
 
=====Test3 starts:=====
List: 
1  2  3  4  5  6  
6th expected result is: 1
 
=====Test4 starts:=====
100th expected result is: null
 
=====Test5 starts:=====
List: 
1  2  3  4  5  6  
7th expected result is: null
 
=====Test6 starts:=====
List: 
1  2  3  4  5  6  
0th expected result is: null
 
 

P107、面试题15:链表中倒数第K个结点的更多相关文章

  1. 面试题 15:链表中倒数第 k 个结点

    面试题 15:链表中倒数第 k 个结点 题目:输入一个链表,输出该链表中倒数第 k 个结点.为了符合大多数人的习惯, 本题从 1 开始计数,即链表的尾结点是倒数第一个结点.例如一个有 6 个结点的 链 ...

  2. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  3. 剑指offer-面试题15.链表中倒数第k个结点

    题目:输入一个链表,输出该链表的倒数第K个结点.为了符合大多数人的习惯,本题 从1开始计数,即链表的尾结点是倒数第1个节点.例如有一个链表有6个节点,从 头节点开始他们的值依次是1,2,3,4,5,6 ...

  4. 15 链表中倒数第k个结点

    输入一个链表,输出该链表中倒数第k个结点. p1先走k-1步,p1 p2再一起走 C++: /* struct ListNode { int val; struct ListNode *next; L ...

  5. 面试题一 链表中倒数第k个结点

    void findLastK(LinkedNode head, int k, int n){ if (head == NULL || k == 0) return; LinkedNode t1 = h ...

  6. (剑指Offer)面试题15:链表中倒数第k个结点

    题目: 输入一个链表,输出该链表中倒数第k个结点. 例如:链表中有6个结点,从头到尾依次为1,2,3,4,5,6,则该链表的倒数第3个结点为4. 链表结点定义: struct ListNode{ in ...

  7. 面试题15:链表中倒数第K个结点

    输入一个链表,输出该链表中倒数第k个结点. 方法1: 这个解法要循环两次链表 /* public class ListNode { int val; ListNode next = null; Lis ...

  8. 剑指Offer面试题15(Java版):链表中倒数第K个结点

    题目: 输入一个链表.输出该链表中倒数第k哥结点.  为了符合大多数人的习惯,本题从1開始计数.即链表的尾结点是倒数第1个结点. 比如一个链表有6个结点.从头结点開始它们的值依次是1.2.3,4,5, ...

  9. 【面试题015】链表中倒数第k个结点

    [面试题015]链表中倒数第k个结点    可以用两个指针,当第一个指针指向了第k个时候,第二个指针让他指向链表的第一个元素,然后这两个指针同时向后面移动, 当第一个指针移动到末尾的时候,第二个指针指 ...

随机推荐

  1. ALI OSS RequestTimeTooSkewed

    php版阿里oss sdk,请求时抛RequestTimeTooSkewed错误,说时间差距太大,搜了一下发现是服务器的时间设置问题. 我们在安装完Centos Linux操作系统之后,点击系统的时间 ...

  2. java中的synchronized关键字

    参考:http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html 多线程并发问题的根因: 在一个对象中有一个变量i=0,有两个线 ...

  3. 解决flash挡住层的问题

    让div在flash上面 设置flash为透明: 插件代码换成如下: <object type="application/x-shockwave-flash" data=&q ...

  4. winfrom 水晶按钮

    闲来无事,从网上找了不少自定义控件,然后整理了一下,做了一个水晶按钮 /// <summary> /// 表示 Windows 的按钮控 /// </summary> [Des ...

  5. thymeleaf 内联语法

    十二. thymeleaf内联语法 内联:th:inline,值有三种:text,javascript,none 12.1 th:inline="text"文本内联 <p t ...

  6. apache、php隐藏头信息的方法

    本文介绍下,在apache与php中隐藏头部信息的方法,有需要的朋友参考下. 一.apache隐藏头部信息 apache 的 httpd.conf 有两个配置可以控制是否显示服务器信息给用户.Serv ...

  7. a标签点击后的虚线框问题

    以前一直用的方法都是: a {outline: none;star:expression(this.onFocus=this.blur());} 后来发现有瑕疵,不完美.体现在页面调用JS动作比较频繁 ...

  8. Python试卷

    3.写一个函数,计算一个给定的日期是该年的第几天. def getday(self,y=None,m=None,d=None): date = datetime(y,m,d) days = date. ...

  9. 实现Linux select IO复用C/S服务器代码

    已在ubuntu 下验证可用 服务器端 #include<stdio.h>#include<unistd.h>#include<stdlib.h>#include& ...

  10. mybatis + postgresql 遇到的问题

    org.postgresql.util.PSQLException: ERROR: relation "circlefence" does not exist  这个问题是数据库表 ...