zoukankan      html  css  js  c++  java
  • P107、面试题15:链表中倒数第K个结点

    题目:输入一个链表,输出该链表中倒数第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
     
     
  • 相关阅读:
    计数排序
    CSS3变形
    前端内存泄露问题
    复杂对象的深拷贝
    JavaScript基本数据类型——Symbol
    随机打乱数组
    唯一重复的数字
    src和href的区别
    iframe的缺点
    link和@import的区别
  • 原文地址:https://www.cnblogs.com/yangyquin/p/4929263.html
Copyright © 2011-2022 走看看