Manually merging: - README.md: I added the description from universe/README.md into the heading of dotfiles/README.md. - .envrc: dotfiles/.envrc was a superset of universe/.envrc - .gitignore: Adding some of the ignored patterns from universe/.gitignore to dotfiles/.gitignore Everything else here should be a simple rename.
		
			
				
	
	
		
			82 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import unittest
 | |
| 
 | |
| 
 | |
| ################################################################################
 | |
| # Solution
 | |
| ################################################################################
 | |
| def length(x):
 | |
|     if not x:
 | |
|         return 0
 | |
|     else:
 | |
|         count = 1
 | |
|         while x:
 | |
|             x = x.next
 | |
|             count += 1
 | |
|         return count
 | |
| 
 | |
| 
 | |
| def kth_to_last_node(k, x):
 | |
|     hops = length(x) - 1
 | |
|     dest = hops - k
 | |
| 
 | |
|     if k == 0:
 | |
|         raise Exception("Our God doesn't support this kind of behavior.")
 | |
| 
 | |
|     if dest < 0:
 | |
|         raise Exception('Value k to high for list.')
 | |
| 
 | |
|     while dest > 0:
 | |
|         x = x.next
 | |
|         dest -= 1
 | |
| 
 | |
|     return x
 | |
| 
 | |
| 
 | |
| ################################################################################
 | |
| # Tests
 | |
| ################################################################################
 | |
| class Test(unittest.TestCase):
 | |
|     class LinkedListNode(object):
 | |
|         def __init__(self, value, next=None):
 | |
|             self.value = value
 | |
|             self.next = next
 | |
| 
 | |
|         def get_values(self):
 | |
|             node = self
 | |
|             values = []
 | |
|             while node is not None:
 | |
|                 values.append(node.value)
 | |
|                 node = node.next
 | |
|             return values
 | |
| 
 | |
|     def setUp(self):
 | |
|         self.fourth = Test.LinkedListNode(4)
 | |
|         self.third = Test.LinkedListNode(3, self.fourth)
 | |
|         self.second = Test.LinkedListNode(2, self.third)
 | |
|         self.first = Test.LinkedListNode(1, self.second)
 | |
| 
 | |
|     def test_first_to_last_node(self):
 | |
|         actual = kth_to_last_node(1, self.first)
 | |
|         expected = self.fourth
 | |
|         self.assertEqual(actual, expected)
 | |
| 
 | |
|     def test_second_to_last_node(self):
 | |
|         actual = kth_to_last_node(2, self.first)
 | |
|         expected = self.third
 | |
|         self.assertEqual(actual, expected)
 | |
| 
 | |
|     def test_first_node(self):
 | |
|         actual = kth_to_last_node(4, self.first)
 | |
|         expected = self.first
 | |
|         self.assertEqual(actual, expected)
 | |
| 
 | |
|     def test_k_greater_than_linked_list_length(self):
 | |
|         with self.assertRaises(Exception):
 | |
|             kth_to_last_node(5, self.first)
 | |
| 
 | |
|     def test_k_is_zero(self):
 | |
|         with self.assertRaises(Exception):
 | |
|             kth_to_last_node(0, self.first)
 | |
| 
 | |
| 
 | |
| unittest.main(verbosity=2)
 |