博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P107、面试题15:链表中倒数第K个结点
阅读量:5901 次
发布时间:2019-06-19

本文共 6652 字,大约阅读时间需要 22 分钟。

题目:输入一个链表,输出该链表中倒数第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
 
 

转载于:https://www.cnblogs.com/yangyquin/p/4929263.html

你可能感兴趣的文章
【转】C++ 笔试面试题目
查看>>
同步和异步的区别
查看>>
委托、Lambda表达式、事件系列02,什么时候该用委托
查看>>
在ASP.NET MVC控制器中获取链接中的路由数据
查看>>
使用ASP.NET Atlas SortBehavior实现客户端排序
查看>>
图像滤镜处理算法:灰度、黑白、底片、浮雕
查看>>
多线程一个错误的例子
查看>>
默认网关及route print
查看>>
Servlet如何处理一个请求?
查看>>
Linux Daily2
查看>>
使用Jquery+CSS如何创建流动导航菜单-Fluid Navigation
查看>>
Office文档出错的几种原因与解决方法
查看>>
【实验报告】实验二:DHCP基本实验
查看>>
气质的培养(哈佛管理世界)
查看>>
Can&#39;t get Kerberos realm
查看>>
正则表达式 学习笔记1.1
查看>>
通过案例学调优之--AWR BaseLine管理
查看>>
如何使用MySQL提升权限
查看>>
keepalived 原理,安装,配置
查看>>
乐在其中设计模式(C#) - 单例模式(Singleton Pattern)
查看>>