标签:out lis ide 而不是 page temp idea image 遍历
输入一个链表,输出该链表中倒数第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中需要将主函数改为:
标签:out lis ide 而不是 page temp idea image 遍历
原文地址:https://www.cnblogs.com/shareidea94/p/10849786.html