题目描述
输入一个链表,输出该链表中倒数第k个结点。
首先想到的肯定是先走到链表末尾,然后再回溯到k节点。但是注意本题是单链表,单链表的节点只有从前往后的指针,而没有从后往前的,因此要想别的思路。
这样的话就需要别的思路。假设链表有n个节点,那么倒数第k个节点就是从头到尾的第n-k+1个节点,这样的话就从头到尾遍历链表,每经过一个节点,计数器加1即可得到链表节点数。当然要想一次遍历即可找到倒数
第k个节点,需要定义两个指针。第一个从链表头节点开始往前走k-1步,此时第二个指针保持不动;从第k步开始第二个指针和第一个同时开始遍历,只是第二个是从头节点,第一个是从第k个节点开始,两个指针之间保持的
距离为k-1,当第一个节点到达链表尾节点时,第二个链表正好到达倒数第k个节点。
当然一下问题会使程序崩溃:
1、输入的链表head为null
2、以head为头结点的链表总数小于k
3、k=0
因此要注意代码的鲁棒性
程序如下:
1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode FindKthToTail(ListNode head,int k) { 12 if(head == null||k <= 0) return null; 13 ListNode node = head; 14 int count = 0; 15 while(node != null){ 16 count++; 17 node = node.next; 18 } 19 if(count<k) return null; 20 ListNode p = head; 21 for(int i = 0;i<count - k;i++){ 22 p = p.next; 23 } 24 return p; // 25 } 26 }