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中需要将主函数改为:


    


  

猜你喜欢

转载自www.cnblogs.com/shareidea94/p/10849786.html