-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlinkedlist.py
More file actions
150 lines (118 loc) · 3.74 KB
/
Copy pathlinkedlist.py
File metadata and controls
150 lines (118 loc) · 3.74 KB
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
class LinkedNode():
prev = None
index = None
data = None
next = None
def __init__(self, data):
self.data = data
class LinkedList(LinkedNode):
head = None
tail = None
size = 0
def __init__(self, node):
if self.head == None:
self.head = node
self.head.index = 0
if self.head.next != None:
self.setTail()
else:
self.tail = node
self.tail.index = 0
self.size = 1
def setTail(self):
current = self.head
while current:
if current.next == None:
self.tail = current
break
def printList(self):
current = self.head
while current:
print("Node data:", current.data)
# print("Node index:",current.index)
# if current.prev != None:
# print("Previous Node index:", current.prev.index)
# else:
# print("Current Head")
current = current.next
def append(self, node):
prevBuffer = self.tail
indexbuffer = self.tail.index
self.tail.next = node
self.tail = node
self.tail.index = indexbuffer + 1
self.tail.prev = prevBuffer
def prepend(self, node):
self.head.prev = node
nextBuffer = self.head
self.head = node
self.head.next = nextBuffer
self.head.index = 0
self.updateIndices()
def updateIndices(self):
current = self.head.next
while current:
current.index = current.prev.index + 1
# print("Updated Data:", current.data)
# print("Updated Index:", current.index)
current = current.next
# print("=============")
def insert(self,index, node):
current = self.head
while current:
if current.index == index:
node.prev = current.prev
node.next = current
node.index = current.index
node.prev.next = node
current.prev = node
current.index = node.index + 1
self.updateIndices()
break
else:
current = current.next
def updateNodeData(self, index, data):
current = self.head
while current:
if current.index == index:
current.data = data
break
else:
current = current.next
def removeHead(self):
self.head.next.prev = None
self.head = self.head.next
self.head.index = 0
self.updateIndices()
def removeTail(self):
self.tail = self.tail.prev
self.tail.next = None
def getSize(self):
self.size = self.tail.index + 1
return print(self.size)
def removeNode(self,index):
if index == self.head.index or index == self.tail.index:
print("use the appropriate function to remove head or tail")
raise IndexError
else:
current = self.head.next
while current:
if current.index == index:
current.prev.next = current.next
current.next.prev = current.prev
self.updateIndices()
break
else:
current = current.next
node = LinkedNode("head")
ll = LinkedList(node)
ll.append(LinkedNode("one"))
ll.append(LinkedNode("bad word"))
ll.prepend(LinkedNode("newHead"))
ll.updateNodeData(1,"old head")
ll.insert(2, LinkedNode("inserted here"))
ll.removeHead()
ll.removeTail()
ll.removeNode(1)
ll.printList()
ll.getSize()