-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSinglyLinkedList.py
More file actions
118 lines (107 loc) · 3.07 KB
/
SinglyLinkedList.py
File metadata and controls
118 lines (107 loc) · 3.07 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
class Node():
def __init__(self, value):
self.value = value
self.next = None
class SinglyLinkedList():
def __init__(self):
self.length = 0
self.head = None
self.tail = None
def __repr__(self):
if self.length > 0:
currentNode = self.head
outputString = ''
for i in range(0, self.length):
outputString += str(currentNode.value) + ' --> '
currentNode = currentNode.next
return str(self.head.value) + ' | ' + str(self.tail.value) + ' | ' + str(self.length) + ' | ' + outputString
else:
return '## | ## | 0 | '
def push(self, value):
newNode = Node(value)
if self.length == 0:
self.head = newNode
self.tail = newNode
else:
self.tail.next = newNode
self.tail = newNode
self.length += 1
def pop(self):
returnValue = self.tail.value
if self.length == 1:
self.head = None
self.tail = None
elif self.length > 1:
currentNode = self.head
for i in range(0, self.length-2):
currentNode = currentNode.next
self.tail = currentNode
self.tail.next = None
else:
return None
self.length -= 1
return returnValue
def shift(self):
if self.length != 0:
self.head = self.head.next
self.length -= 1
def unshift(self, value):
newNode = Node(value)
if self.length == 0:
self.tail = newNode
else:
newNode.next = self.head
self.head = newNode
self.length += 1
def get(self, position):
if position < self.length and position >=0:
currentNode = self.head
for i in range(0, position):
currentNode = currentNode.next
return currentNode.value
else:
return None
def set(self, position, value):
if position < self.length and position >= 0:
currentNode = self.head
for i in range(0, position):
currentNode = currentNode.next
currentNode.value = value
def insert(self, position, value):
if position == 0:
self.unshift(value)
elif position == self.length-1:
self.push(value)
elif position < self.length-1 and position > 0:
currentNode = self.head
for i in range(0, position-1):
currentNode = currentNode.next
newNode = Node(value)
newNode.next = currentNode.next
currentNode.next = newNode
self.length +=1
def remove(self, position):
if position == 0:
self.shift()
elif position == self.length - 1:
self.pop()
elif position > 0 and position < self.length-1:
currentNode = self.head
for i in range(0, position-1):
currentNode = currentNode.next
currentNode.next = currentNode.next.next
self.length -=1
def reverse(self):
temp = self.head
self.head = self.tail
self.tail = temp
prevNode = self.tail
currentNode = prevNode.next
nextNode = None
for i in range(0, self.length-2):
nextNode = currentNode.next
print(prevNode.value, currentNode.value, nextNode.value)
currentNode.next = prevNode
prevNode = currentNode
currentNode = nextNode
currentNode.next = prevNode