Find Kth from Head
by Isai Damier, Android Engineer @ Google
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | /*************************************************************************** * Author: Isai Damier * Title: Singly Linked List * Project: geekviewpoint * Package: datastructure * * Description: A LinkedList is a data structure that allows access * to a collection of data using pointers/references. While an * array can also be defined as above, LinkedLists and arrays differ * in how they are stored in memory and in the operations they * allow. Unlike an array that must be stored in a block of memory, * the nodes of a LinkedList can be stored anywhere because each * node has a reference to the node that succeeds it. Because the * nodes are stored so loosely, inserting nodes into a LinkedList * is easy; whereas in an array, all the succeeding elements must * be shifted. Of course, insertion also means changing the size of * the array, which means creating the entire array anew. * * Perhaps the greatest beauty of LinkedList is that it allows * accessing an entire sequence of nodes using only one variable: * a reference to the first node in the sequence. * * Countless operations can be performed on LinkedLists. Following * are a few, ranging from the common to the very interesting. **************************************************************************/ public class SinglyLinkedList { Node head = null ; Node tail = null ; /***************************************************************** * Statement: * Retrieve the kth element from this list, where * the head is the 0th element. * * Time Complexity of Solution: * Best = O(1); Worst = O(k). * * Technical Details: Simply count from 0 to k, meanwhile moving * a pointer. Then return the pointer. *****************************************************************/ public Node findKthFromHead( int k) { if ( 0 > k) { return null ; } Node tmp = head; int count = 0 ; while (count < k && null != tmp) { tmp = tmp.next; count++; } return tmp; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public class SinglyLinkedListTest { /** * Test of findKthFromHead method, of class SinglyLinkedList. */ @Test public void testFindKthFromHead() { System.out.println( "findKthFromHead" ); int [] input = { 9 , 4 , 5 , 2 , 1 , 12 , 6 , 7 , 4 , 8 , 3 , 0 , 16 , 19 , 11 }; SinglyLinkedList linkedList = new SinglyLinkedList(); for ( int i = 0 ; i < input.length; i++) { linkedList.addToTail(input[i]); } int k = 0 ; assertEquals(input[k], linkedList.findKthFromHead(k).data); k = input.length / 2 ; assertEquals(input[k], linkedList.findKthFromHead(k).data); k = input.length - 1 ; assertEquals(input[k], linkedList.findKthFromHead(k).data); k = input.length + 21 ; assertEquals( null , linkedList.findKthFromHead(k)); k = - 1 ; assertEquals( null , linkedList.findKthFromHead(k)); } } |