I took this as a challenge and implemented linked list data structure in python
class Node:
def __init__(self, data, nxt=None):
self.data = data
self.next = nxt
class LinkedList:
def __init__(self, arr=None):
if arr in [None, []]:
self.head = None
else:
self.arrayToLinked(arr)
def arrayToLinked(self, arr):
self.head = Node(arr[0])
temp = self.head
for i in range(1, len(arr)):
temp.next = Node(arr[i])
temp = temp.next
def append(self, new_val):
new_node = Node(new_val)
if self.head is None:
self.head = new_node
return
last = self.head
while last.next is not None:
last = last.next
last.next = new_node
def linkedToArray(self):
arr = []
temp = self.head
while temp is not None:
arr.append(temp.data)
temp = temp.next
return arr
def removeDuplicates(self):
pass
def sort(self):
arr = []
temp = self.head
while temp is not None:
arr.append(temp.data)
temp = temp.next
self.arrayToLinked(sorted(arr))
def index(self, val):
temp = self.head
i = 0
while temp is not None:
if temp.data == val: return i
i += 1
return -1
def min(self):
mini = self.head.data
temp = self.head
while temp is not None:
if mini > temp.data:
mini = temp.data
return mini
def max(self):
maxi = self.head.data
temp = self.head
while temp is not None:
if maxi < temp.data:
maxi = temp.data
return maxi
def push(self, data):
new_node = Node(data)
new_node.next = self.head
self.head = new_node
@staticmethod
def insertNode(prev_node, new_val):
new_node = Node(new_val)
new_node.next = prev_node.next
prev_node.next = new_node
def insertIndex(self, pos, data):
data = Node(data)
i = 0
temp = self.head
while i < pos:
if temp is None or temp.next is None:
return
temp = temp.next
i += 1
dum = temp
temp = data
temp.next = dum
self.head = temp
def delete(self, key):
temp = self.head
if temp is not None and temp.data == key:
self.head = temp.next
return
prev = None
while temp is not None:
if temp.data == key:
break
prev = temp
temp = temp.next
if temp is None:
return
prev.next = temp.next
def deleteIndex(self, pos):
if self.head is None:
return
temp = self.head
if pos == 0:
self.head = temp.next
return
for i in range(pos - 1):
temp = temp.next
if temp is None:
break
if temp is None or temp.next is None:
return
val = temp.next.next
temp.next = None
temp.next = val
def pop(self, pos):
if self.head is None:
return
temp = self.head
if pos == 0:
self.head = temp.next
return
for i in range(pos - 1):
temp = temp.next
if temp is None:
break
if temp is None or temp.next is None:
return
val = temp.next.next
pop_val = temp.next
temp.next = None
temp.next = val
return pop_val
def count(self, element):
temp = self.head
count = 0
while temp is not None:
if temp.data == element:
count += 1
temp = temp.next
return count
def remove(self, element):
temp = self.head
while temp is not None:
if temp.next is not None and temp.next.data == element:
dum = temp.next.next
temp.next = None
temp.next = dum
temp = temp.next
def isLoop(self):
s = set()
temp = self.head
while temp:
if temp in s:
return True
s.add(temp)
temp = temp.next
return False
def findLoop(self):
s = set()
temp = self.head
while temp:
if temp in s:
return temp
s.add(temp)
temp = temp.next
def createLoop(self, data):
ind = self.index(data)
last = self.head
while last.next is not None:
last = last.next
last.next = self[ind]
def reverse(self):
result = None
temp = self.head
while temp:
result = Node(temp.data, temp)
temp = temp.next
self.head = result
def len(self):
c = 0
temp = self.head
while temp is not None:
c += 1
temp = temp.next
return c
def clear(self):
self.head = None
def copy(self):
return self.arrayToLinked(self.linkedToArray())
def __getitem__(self, index):
arr = []
temp = self.head
while temp is not None:
arr.append(temp)
temp = temp.next
return arr[index]
def getValues(self, index):
arr = []
temp = self.head
while temp is not None:
arr.append(temp.data)
temp = temp.next
return arr[index]
def print(self):
arr = []
m = self.head
while m is not None:
arr.append(str(m.data))
m = m.next
print(' -> '.join(arr))
I want to make the code as short as possible, while maintaining neatness.
Thanks!