forked from bellshade/Python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
singly_linked_list.py
133 lines (110 loc) · 4.43 KB
/
singly_linked_list.py
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
class Node:
# Class Node digunakan untuk membangun node pada linked list.
# Class ini memiliki properti next yang berfungsi sebagai
# penunjuk untuk node selanjutnya dan properti val
# sebagai properti yang menampung nilai pada node
def __init__(self, val=None):
self.next = None
self.val = val
class SingleLinkedList:
# Class SingleLinkedList digunakan untuk membuat single linked list
# dari kumpulan node
def __init__(self):
# Constructor __init__ digunakan untuk menginisialisasi
# head dari linked list
self.linked_list_head = None
def insert(self, new_node):
# Method insert digunakan untuk menambahkan node pada linked list.
# Method ini memiliki parameter new_node di mana parameter ini
# menerima argumen berupa class Node().
# Method ini memiliki sebuah blok if-else, di mana blok ini akan
# memeriksa apakah head dari linked list ini ada atau tidak (None).
# Jika head dari linked list tidak ada, maka method ini akan
# menginisasi Node pada argumen sebagai head dari linked list, jika
# tidak maka Node pada argumen akan ditambah di belakang (tail)
if self.linked_list_head is None:
self.linked_list_head = new_node
else:
temp = self.linked_list_head
while temp.next is not None:
temp = temp.next
temp.next = new_node
def insert_after(self, target_val, new_node):
# Method insert_after digunakan untuk menambah node setelah node
# tertentu. Method ini menerima argumen parameter target_val yang
# berfungsi sebagai penanda di mana node yang baru akan
# ditambahkan dan argumen new_node yang menerima class Node().
# Variabel temp merupakan class Node, tepatnya head dari
# linked list dan digunakan untuk mencari value dari target_val
temp = self.linked_list_head
while temp.val != target_val:
temp = temp.next
new_node.next = temp.next
temp.next = new_node
# mengosongkan node temp
temp = None # lgtm [py/unused-local-variable]
def delete_head(self):
# Method delete_head digunakan untuk menghapus head dari
# linked list
temp = self.linked_list_head.next
self.linked_list_head = None
self.linked_list_head = temp
def delete_tail(self):
# Method delete_tail digunakan untuk menghapus tail dari
# linked list
temp = self.linked_list_head
if temp.next is None:
self.delete_head()
return
while temp.next.next is not None:
temp = temp.next
temp.next = None
def delete_node(self, target_val):
# Method delete_node berfungsi untuk menghapus sebuah node
# dari linked list. Method ini menerima argumen target_val, yaitu
# nilai dari node pada linked list.
temp = self.linked_list_head
if temp.val == target_val:
# jika value dari temp sama dengan value dari head
self.delete_head()
return
while temp.next.val != target_val:
temp = temp.next
temp.next = temp.next.next
def print_linked_list(self):
# Method print_linked_list berfungsi untuk mencetak linked list
result = []
temp = self.linked_list_head
while temp is not None:
result.append(str(temp.val))
temp = temp.next
linked_list_result = " -> ".join(result)
print(linked_list_result)
if __name__ == "__main__":
linked_list = SingleLinkedList()
linked_list.insert(Node(5))
linked_list.insert(Node(3))
linked_list.insert(Node(4))
# menghasilkan 5 -> 3 -> 4
linked_list.print_linked_list()
linked_list.insert_after(3, Node(6))
# menghasilkan 5 -> 3 -> 6 -> 4
linked_list.print_linked_list()
linked_list.delete_head()
# menghasilkan 3 -> 6 -> 4
linked_list.print_linked_list()
linked_list.delete_node(6)
# menghasilkan 3 -> 4
linked_list.print_linked_list()
linked_list.delete_node(3)
# menghasilkan 4
linked_list.print_linked_list()
linked_list.insert(Node(5))
# menghasilkan 4 -> 5
linked_list.print_linked_list()
linked_list.delete_tail()
# menghasilkan 4
linked_list.print_linked_list()
linked_list.delete_tail()
# seluruh elemen pada linked list telah dihapus
linked_list.print_linked_list()