This notebook was prepared by Donne Martin. Source and license info is on GitHub.

# Challenge Notebook¶

## Constraints¶

• Can we assume this is a non-circular, singly linked list?
• Yes
• Do we keep track of the tail or just the head?
• Can we insert None values?
• No

## Test Cases¶

### Insert to Front¶

• Insert a None
• Insert in an empty list
• Insert in a list with one element or more elements

### Append¶

• Append a None
• Append in an empty list
• Insert in a list with one element or more elements

### Find¶

• Find a None
• Find in an empty list
• Find in a list with one element or more matching elements
• Find in a list with no matches

### Delete¶

• Delete a None
• Delete in an empty list
• Delete in a list with one element or more matching elements
• Delete in a list with no matches

### Length¶

• Length of zero or more elements

### Print¶

• Print an empty list
• Print a list with one or more elements

## Algorithm¶

Refer to the Solution Notebook. If you are stuck and need a hint, the solution notebook's algorithm discussion might be a good place to start.

## Code¶

In [ ]:
class Node(object):

def __init__(self, data, next_node=None):
pass
# TODO: Implement me

def __str__(self):
pass
# TODO: Implement me

pass
# TODO: Implement me

def __len__(self):
pass
# TODO: Implement me

def insert_to_front(self, data):
pass
# TODO: Implement me

def append(self, data):
pass
# TODO: Implement me

def find(self, data):
pass
# TODO: Implement me

def delete(self, data):
pass
# TODO: Implement me

def print_list(self):
pass
# TODO: Implement me

def get_all_data(self):
pass
# TODO: Implement me


## Unit Test¶

The following unit test is expected to fail until you solve the challenge.

In [ ]:
# %load test_linked_list.py
import unittest

def test_insert_to_front(self):
print('Test: insert_to_front on an empty list')

print('Test: insert_to_front on a None')

print('Test: insert_to_front general case')

print('Success: test_insert_to_front\n')

def test_append(self):
print('Test: append on an empty list')

print('Test: append a None')

print('Test: append general case')

print('Success: test_append\n')

def test_find(self):
print('Test: find on an empty list')
self.assertEqual(node, None)

print('Test: find a None')
self.assertEqual(node, None)

print('Test: find general case with matches')
self.assertEqual(str(node), 'a')

print('Test: find general case with no matches')
self.assertEqual(node, None)

print('Success: test_find\n')

def test_delete(self):
print('Test: delete on an empty list')

print('Test: delete a None')

print('Test: delete general case with matches')

print('Test: delete general case with no matches')

print('Success: test_delete\n')

def test_len(self):
print('Test: len on an empty list')

print('Test: len general case')

print('Success: test_len\n')

def main():
test.test_insert_to_front()
test.test_append()
test.test_find()
test.test_delete()
test.test_len()

if __name__ == '__main__':
main()


## Solution Notebook¶

Review the Solution Notebook for a discussion on algorithms and code solutions.