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