题目
Implement an algorithm to find the kth to last element of a singly linked list.
分析
这道题目的难点在于:如何确定某个元素是倒数第K个,要想解决这个问题,我首先想到的是求得这个链表的长度,即遍历一遍,再自然求得倒数第K个元素,时间复杂度为O(2n-K).
另一种更加巧妙的方法是,同时建立两个指针,他们一开始同时指向链首,当第一个指针遍历到第K个元素时,第二个元素再开始遍历,此后两个指针同时进行遍历。这样,两个指针之间的距离为K,因为当第一个指针指向链尾时,第二个指针指向的就是倒数第K个元素。
代码
1 //Implement an algorithm to find the kth to last element of a singly linked list. 2 package com.careercup.chapter2; 3 4 public class CareerCup_2_2 { 5 public static int FindKth1(LinkNode head, int k){ 6 LinkNode currnode = head; 7 int count=0; 8 while(currnode!=null){ 9 count++; 10 currnode = currnode.getNext(); 11 } 12 currnode = head; 13 int i =0; 14 while(currnode!=null){ 15 if(i>count-k) return currnode.getValue(); 16 i++; 17 currnode = currnode.getNext(); 18 } 19 return -1; 20 21 22 } 23 public static int FindKth2(LinkNode head, int k){ 24 LinkNode currnode1 = head; 25 int count = 0; 26 while(currnode1!=null && count < k){ 27 count++; 28 currnode1 = currnode1.getNext(); 29 } 30 LinkNode currnode2 = head; 31 while(currnode1!=null){ 32 currnode1 = currnode1.getNext(); 33 currnode2 = currnode2.getNext(); 34 } 35 while(currnode2!=null){ 36 return currnode2.getValue(); 37 } 38 39 return -1; 40 } 41 42 43 44 45 46 47 48 }