【每日一题】CareerCup2.2 寻找链表中倒数第K个元素

题目

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 }

 

 

 

posted @ 2013-03-09 12:52  Sayary  阅读(194)  评论(0编辑  收藏  举报