1
+ import unittest
2
+
3
+ # Author: Robert Joseph
4
+
5
+
1
6
class Node :
2
- def init (self , data = None , next_node = None , prev_node = None ):
3
- self .data = data
4
- self .next_node = next_node
5
- self .prev_node = prev_node
7
+ def __init__ (self , data = None , next_node = None , prev_node = None ):
8
+ """
9
+ This class represents a node in a doubly linked list.
10
+ Each node contains data, a reference to the next node, and a reference to the previous node.
11
+ """
12
+ self .data = data
13
+ self .next_node = next_node
14
+ self .prev_node = prev_node
15
+
6
16
7
17
class LinkedList :
8
- def init (self ):
9
- self .head = None
10
- self .tail = None
11
-
12
- def append (self , data ):
13
- new_node = Node (data )
14
- if self .head is None :
15
- self .head = new_node
16
- self .tail = new_node
17
- else :
18
- self .tail .next_node = new_node
19
- new_node .prev_node = self .tail
20
- self .tail = new_node
21
-
22
- def prepend (self , data ):
23
- new_node = Node (data )
24
- if self .head is None :
25
- self .head = new_node
26
- self .tail = new_node
27
- else :
28
- self .head .prev_node = new_node
29
- new_node .next_node = self .head
30
- self .head = new_node
31
-
32
- def delete (self , data ):
33
- current_node = self .head
34
- while current_node is not None :
35
- if current_node .data == data :
36
- if current_node .prev_node is not None :
37
- current_node .prev_node .next_node = current_node .next_node
38
- if current_node .next_node is not None :
39
- current_node .next_node .prev_node = current_node .prev_node
40
- if current_node == self .head :
41
- self .head = current_node .next_node
42
- if current_node == self .tail :
43
- self .tail = current_node .prev_node
44
- current_node = current_node .next_node
45
-
46
- def search (self , data ):
47
- current_node = self .head
48
- while current_node is not None :
49
- if current_node .data == data :
50
- return current_node
51
- current_node = current_node .next_node
52
- return None
53
-
54
- def print_list (self ):
55
- current_node = self .head
56
- while current_node is not None :
57
- print (current_node .data )
58
- current_node = current_node .next_node
18
+ def __init__ (self ):
19
+ """
20
+ This class represents a doubly linked list.
21
+ It contains a reference to the head (the first node) and the tail (the last node) of the list.
22
+ """
23
+ self .head = None
24
+ self .tail = None
25
+
26
+ def append (self , data ):
27
+ """
28
+ Appends a new node with the given data to the end of the linked list.
29
+ Time complexity: O(1)
30
+ """
31
+ new_node = Node (data )
32
+ if self .head is None :
33
+ self .head = new_node
34
+ self .tail = new_node
35
+ else :
36
+ self .tail .next_node = new_node
37
+ new_node .prev_node = self .tail
38
+ self .tail = new_node
39
+
40
+ def prepend (self , data ):
41
+ """
42
+ Prepends a new node with the given data to the beginning of the linked list.
43
+ Time complexity: O(1)
44
+ """
45
+ new_node = Node (data )
46
+ if self .head is None :
47
+ self .head = new_node
48
+ self .tail = new_node
49
+ else :
50
+ self .head .prev_node = new_node
51
+ new_node .next_node = self .head
52
+ self .head = new_node
53
+
54
+ def delete (self , data ):
55
+ """
56
+ Deletes the first occurrence of a node with the given data from the linked list.
57
+ Time complexity: O(n)
58
+ """
59
+ current_node = self .head
60
+ while current_node is not None :
61
+ if current_node .data == data :
62
+ if current_node .prev_node is not None :
63
+ current_node .prev_node .next_node = current_node .next_node
64
+ if current_node .next_node is not None :
65
+ current_node .next_node .prev_node = current_node .prev_node
66
+ if current_node == self .head :
67
+ self .head = current_node .next_node
68
+ if current_node == self .tail :
69
+ self .tail = current_node .prev_node
70
+ current_node = current_node .next_node
71
+
72
+ def search (self , data ):
73
+ """
74
+ Searches for the first occurrence of a node with the given data in the linked list.
75
+ Returns the node if found, None otherwise.
76
+ Time complexity: O(n)
77
+ """
78
+ current_node = self .head
79
+ while current_node is not None :
80
+ if current_node .data == data :
81
+ return current_node
82
+ current_node = current_node .next_node
83
+ return None
84
+
85
+ def print_list (self ):
86
+ """
87
+ Prints the elements of the linked list.
88
+ Time complexity: O(n)
89
+ """
90
+ current_node = self .head
91
+ while current_node is not None :
92
+ print (current_node .data )
93
+ current_node = current_node .next_node
94
+
95
+
96
+ class TestLinkedList (unittest .TestCase ):
97
+ def test_linked_list (self ):
98
+ # Initialize the linked list
99
+ linked_list = LinkedList ()
100
+
101
+ # Append nodes
102
+ linked_list .append (1 )
103
+ linked_list .append (2 )
104
+ linked_list .append (3 )
105
+
106
+ # Test the print_list method
107
+ self .assertEqual (linked_list .print_list (), None ) # No return value, so None is expected
108
+
109
+ # Test the search method
110
+ self .assertEqual (linked_list .search (2 ), linked_list .head .next_node ) # The second node should contain 2
111
+
112
+ # Test the delete method
113
+ linked_list .delete (2 )
114
+ self .assertEqual (linked_list .search (2 ), None ) # The node with data 2 should no longer exist
115
+
116
+
117
+ if __name__ == '__main__' :
118
+ unittest .main ()
0 commit comments