学习数据结构,以前一头雾水的东西现在很清晰了。双链表的实现,包含了增删改查反序等基本操作
# -*- coding: utf-8 -*-
'''
############################### Meet33 double linklist
'''
class Node(object):
def __init__(self,val,n=None,p=None):
self.data = val
self.next = n
self.prev = p
def get_next(self):
return self.next
def get_prev(self):
return self.prev
def set_next(self, n):
self.next = n
def set_prev(self, p):
self.prev = p
class LinkList(object):
def __init__(self):
self.head = None
self.last = None
self.length = 0
def __getitem__(self, ind):
if self.is_empty():
print('linklist is empty!')
return
elif ind < 0 or ind > self.get_length():
print('this key is not exist!')
return
else:
return self.getitem(ind)
def __setitem__(self, ind, value):
if self.is_empty():
print('linklist is empty!')
return
elif ind < 0 or ind > self.get_length():
print('this key is not exist!')
return
else:
self.delete(ind)
return self.insert(ind, value)
def initlist(self,data):
if len(data) <= 0:
print('data is empty!')
return
self.head = Node(data[0])
self.head.set_prev(None)
p = self.head
node = None
for i in data[1:]:
node = Node(i)
p.set_next(node)
node.set_prev(p)
#p.next = node
#node.prev = p
p = p.get_next()
#p.set_prev()
self.last = node
self.length = len(data)
def get_length(self):
return self.length
def is_empty(self):
if self.get_length() == 0:
return True
else:
return False
def clear(self):
self.head = None
self.last = None
self.length = 0
def append(self, item):
q = Node(item)
if self.head is None:
self.head = q
self.last = q
else:
p = self.head
while p.next is not None:
p = p.next
p.next = q
q.prev = p
self.last = q
q.set_next(None)
self.length += 1
def getitem(self, index):
index = int(index)
if self.is_empty():
print('linklist is empty!')
return
if index > self.length - 1 or index < 0:
print('index error!')
return
j = 0
p = self.head
while p.next != 0 and j < index:
p = p.next
j += 1
if j == index:
return p.data
else:
print('target is not exist!')
def insert(self,index,item):
index = int(index)
if item is None:
print('item cant be None!')
return
if self.is_empty() or index < 0 or index > self.get_length() - 1:
print('index error or linklist is empty')
return
if index == 0:
h = self.head
q = Node(item)
self.head = q
self.head.set_prev(None)
self.head.set_next(h)
p = self.head
post = self.head
j = 0
while p.next is not None and j < index:
post = p
p = p.next
j += 1
if index == j:
q = Node(item)
post.next = q
q.prev = post
q.next = p
p.prev = q
self.length += 1
def delete(self, index):
if self.is_empty() or index < 0 or index > self.length - 1:
print('index error or linklist is empty')
return
if index == 0:
if self.length == 1:
self.head = None
self.last = None
self.length = 0
print('now linklist is empty')
else:
h = self.head
self.head = Node(h.next.data)
self.head.set_next(h.get_next().get_next())
self.head.set_prev(None)
h.next.set_prev(self.head)
self.length -= 1
print('delete head')
return
p = self.head
post = self.head
j = 0
while p.next is not None and j < index:
post = p
p = p.next
j += 1
if index == j:
if p.next is None:
print('delete last')
post.next = None
self.last = post
else:
post.next = p.next
p.next.prev = post
self.length -= 1
def get_index(self, value):
if self.is_empty():
print('linklist is empty!')
return
p = self.head
j = 0
while p.next is not None and p.data != value:
p = p.next
j += 1
if p.data == value:
return j
else:
return -1
def show(self):
if self.is_empty():
print('linklist is empty!')
return
print('LL =',end=' ')
p = self.head
leng = self.get_length()
for i in range(leng):
if i < leng - 1:
print(p.data,end=',')
else:
print(p.data)
p = p.get_next()
def reverse(self):
# only need to change the Nodes' atttibutes, then change the head as end Node, over
if self.is_empty():
print('linklist is empty!')
return
h = self.head
h0 = self.head
nextNode = self.head.get_next()
#temp = Node(1)
while nextNode is not None:
temp = nextNode.get_next()
nextNode.set_next(h)
h.set_prev(nextNode)
h = nextNode
nextNode = temp
self.head.next = None
self.head = h
self.last = h0
self.last.set_next(None)
if __name__ == '__main__':
import time
l0 = LinkList()
l0.show()
temp = [1,2,'3',4,5,{"a":6},7,8]
l0.initlist(temp)
l0.show()
l0.delete(2)
l0.show()
l0.insert(2,33)
l0.show()
l0.__setitem__(2,3)
l0.show()
t0 = time.time()
for i in range(9999):
#print('i=',i)
l0.reverse()
t1 = time.time()
t2 = t1 - t0
l0.show()
print('l0.head.data=',l0.head.data)
print('l0.last.data=',l0.last.data)
print('after delete index 0:',end=' ')
l0.delete(0)
l0.show()
print('after delete last:',end=' ')
end = l0.get_index(l0.last.data)
l0.delete(end)
l0.show()