14 链表中倒数第K个节点 FindKthToTail

Posted shareidea94

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了14 链表中倒数第K个节点 FindKthToTail相关的知识,希望对你有一定的参考价值。

输入一个链表,输出该链表中倒数第k个结点。

核心思想: 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点。

然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了

 

时间复杂度O(n),一次遍历即可

 

 1 /*
 2 public class ListNode 
 3     int val;
 4     ListNode next = null;
 5 
 6     ListNode(int val) 
 7         this.val = val;
 8     
 9 */
10 import java.util.*;
11 public class Solution 
12     public static ListNode FindKthToTail(ListNode head,int k) 
13         //特殊情况判定
14         if(head==null)    return null;
15         if(k<=0)    return null;
16         //建立两个指针
17         ListNode fastptr = head;
18         ListNode slowptr = head;
19         //快的指针跑到了第k-1个节点处(默认第一个节点是1而不是0)
20         for(int i=1;i<k;i++)
21             if(fastptr.next != null)
22                 fastptr = fastptr.next;
23             
24             else    return null; //要考虑到链表长度小于K的情况
25         
26         while(fastptr.next != null)
27             fastptr = fastptr.next;
28             slowptr = slowptr.next;
29         
30         return slowptr;
31     
32     public static void main(String [] args)
33         Scanner sc = new Scanner(System.in);
34         System.out.println("请输入倒数第几个节点");
35         int k= sc.nextInt();
36         System.out.println("请依次输入链表");
37         ListNode head = null;
38         if(sc.hasNext())    head = new ListNode(sc.nextInt());
39         ListNode temp = head;
40         while(sc.hasNext())
41             temp = new ListNode(sc.nextInt());
42             temp = temp.next;
43         
44         temp.next = null;
45         ListNode result = FindKthToTail(head,k);
46         System.out.println("该链表的倒数第k个节点是"+ result);
47     
48 

 

调试中出现的bug

bug1: 没有考虑到K为负数或者K为0的情况,没有考虑head为空的情况,添加了13和14行代码

bug2:    没有考虑K远远大于链表长度的时候,可以选择将K和链表length做比较,此时需要再写一个length函数,比较费劲

    或者可以用来解决这种情况,注意此处是fastptr.next而不是fastptr

17         for(int i=1;i<k;i++)
18             if(fastptr.next != null)
19                 fastptr = fastptr.next;
20             
21             else    return null;

bug3:   在IDEA判断链表输入何时结束出了问题,而牛客网不用输入结束条件

技术图片

图片参考来自于:https://yinziang.github.io/yinziang/2018/03/05/Algo-OJ-Others-3/

在IDEA中需要将主函数改为:


    


  

技术图片

以上是关于14 链表中倒数第K个节点 FindKthToTail的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer-14.链表中倒数第k个结点(C++/Java)

剑指JZ14_链表中倒数第K个节点

JZ3.从尾到头打印链表;JZ14.链表中倒数第K个节点;JZ15.反转链表;JZ16.合并两个有序链表;JZ36.两个链表的第一个公共节点;JZ55.链表中环的入口节点;JZ56.删除链表中重复节点

JZ3.从尾到头打印链表;JZ14.链表中倒数第K个节点;JZ15.反转链表;JZ16.合并两个有序链表;JZ36.两个链表的第一个公共节点;JZ55.链表中环的入口节点;JZ56.删除链表中重复节点

链表中倒数第 K 个结点

剑指 Offer 22. 链表中倒数第k个节点