class Node:
def __init__(self,elem,link=None):
self.elem = elem
self.next = link
'''
方法说明
__init__:初始化方法
obtainListLen:输出表元素
obtainListElems:输出表长度
插入元素
-prepend:首段插入元素O(1)
-append:尾端插入元素O(n)
-insert:定位插入元素O(n)
删除元素
-popleft:删除首端元素O(1)
-popright:删除尾端元素O(n)
-delete:定位删除元素O(n)
reverse: 链表反序
sorting:链表排序(asc正序 | desc反序)
'''
class LinkList:
def __init__(self):
self.head = None
def obtainListElems(self):
p = self.head
elems = []
if p == None:
return elems
else:
while p != None:
elems.append(p.elem)
p = p.next
return elems
def obtainListLen(self):
p,n = self.head,0
while p != None:
n += 1
p = p.next
return n
def prepend(self,elem):
self.head = Node(elem,self.head)
def popleft(self):
if self.head == None:
return 'list is empty and can not pop'
e = self.head.elem
self.head = self.head.next
return e
def append(self,elem):
if self.head == None:
self.head = Node(elem)
else:
p = self.head
while p.next != None:
p = p.next
p.next = Node(elem)
def popright(self):
if self.head == None:
return 'list is empty and can not pop'
p = self.head
if p.next == None:
e = self.head.elem
self.head = None
else:
while p.next.next != None:
p = p.next
e = p.next.elem
p.next = None
return e
def insert(self,i,e):
n = self.obtainListLen()
if i == 0:
self.prepend(e)
elif i == n:
self.append(e)
elif i > 0 and i < n:
i = i - 1
p = self.head
while p != None and i > 1:
p = p.next
q = Node(e)
q.next = p.next
p.next = q
else:
return 'insert is failed'
def delete(self,i):
n = self.obtainListLen()
if i == 0:
return self.popleft()
elif i == n-1:
return self.popright()
elif i > 0 and i < n-1:
i = i - 1
p = self.head
while p != None and i > 1:
p = p.next
e = p.next.elem
p.next = p.next.next
return e
else:
return 'insert is failed'
def reverse(self):
p = None
while self.head != None:
q = self.head
self.head = q.next
q.next = p
p = q
self.head = p
def sorting_asc(self):
if self.head == None:
return 'list is empty'
crt = self.head.next
while crt != None:
x = crt.elem
p = self.head
while p != crt and p.elem <= x:
p = p.next
while p != crt:
y = p.elem
p.elem = x
x = y
p = p.next
crt.elem = x
crt = crt.next
def sorting_desc(self):
if self.head == None:
return 'list is empty'
crt = self.head.next
while crt != None:
x = crt.elem
p = self.head
while p != crt and p.elem >= x:
p = p.next
while p != crt:
y = p.elem
p.elem = x
x = y
p = p.next
crt.elem = x
crt = crt.next