解题思路
为了能够只遍历一次就能找到倒数第k个节点,可以定义两个指针:
(1)第一个指针从链表的头指针开始遍历向前走k-1,第二个指针保持不动;
(2)从第k步开始,第二个指针也开始从链表的头指针开始遍历;
(3)由于两个指针的距离保持在k-1,当第一个(走在前面的)指针到达链表的尾结点时,第二个指针(走在后面的)指针正好是倒数第k个结点。
当我们用一个指针遍历链表不能解决问题的时候,可以尝试用两个指针来遍历链表。可以让其中一个指针遍历的速度快一些(比如一次在链表上走两步),或者让它先在链表上 走若干步。
另外还要注意链表为空和K为0的情况
问题描述
输入一个链表,输出该链表中倒数第k个结点
代码实现
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 ListNode first = head; 13 ListNode last = head; 14 if(head==null||k==0){ 15 return null; 16 } 17 for(int j=0; j<k-1; j++){ 18 if(first.next!=null){ 19 first = first.next; 20 } 21 else{ 22 return null; 23 } 24 } 25 while(first.next != null){ 26 first = first.next; 27 last = last.next; 28 } 29 return last; 30 } 31 }