链表是数据结构中基础且重要的一环,其主要分为:
1.单项链表
2. 单项循环链表
3. 双向链表
4. 双向循环链表
单向链表
class ListNode():
def __init__(self,val,next=None):
"定义节点"
self.val = val
self.next = next
class SingelLinkList():
def __init__(self):
self.head = None
def is_empty(self):
"判断链表是否为空"
return self.head is None
def __len__(self):
"获取链表长度"
count = 0
cur = self.head
while cur!=None:# 当指针无指向便代表链表结束
count += 1
cur = cur.next
return count
def travel(self):
"遍历链表"
cur = self.head
while cur!=None:
print(cur.val,end=' ')
cur = cur.next
print()
def add(self,value):
"头部添加节点"
node = ListNode(value)
if self.is_empty():
self.head = node
else:
node.next = self.head
self.head = node
def append(self,value):
"尾部添加节点"
node = ListNode(value)
cur = self.head
if self.is_empty():
self.add(value)
return
else:
while cur.next!=None:
cur = cur.next
cur.next = node
def insert(self,pos,value):
"指定位置添加节点"
count = 1
cur = self.head
if self.is_empty() or pos<=1:
self.add(value)
return
elif pos>=self.__len__():
self.append(value)
return
node = ListNode(value)
while count<pos-1 and count<self.__len__():
count += 1
cur = cur.next
node.next = cur.next
cur.next = node
def remove(self,value):
"删除指定值节点"
cur = self.head
if self.is_empty():
return
if cur.val == value:
self.head = cur.next
return
while cur.next!=None:
if cur.next.val == value:
cur.next = cur.next.next
break
else:
cur = cur.next
def remove_pos(self,pos):
"指定位置删除节点"
count = 1
cur = self.head
if self.is_empty():
return
if pos<=1:
self.head = cur.next
return
while count<pos-1 and count<self.__len__()-1:
count += 1
cur = cur.next
if pos>=self.__len__():
cur.next = None
else:
cur.next = cur.next.next
def search(self,value):
"查找节点"
count = 1
cur = self.head
while cur!=None:
if cur.val == value:
print('%s位于链表中,为%d号节点'%(value,count))
return
else:
count += 1
cur = cur.next
print('%s不存在链表'%value)
def clear(self):
"清空链表"
self.head = None
单向循环链表
class ListNode():
def __init__(self,val,next=None):
self.val = val
self.next = next
class SingelCycleList():
def __init__(self,node=None):
self.head = None
if node:#生成链表对象时,若传入一个非空节点,要使第一个节点的next指针指向自身
node.next = node
def is_empty(self):
return self.head is None
def __len__(self):
count = 1
cur = self.head
if self.is_empty():
return 0
while cur.next!=self.head:
count += 1
cur = cur.next
return count
def travel(self):
cur = self.head
if self.is_empty():
return
while cur.next!=self.head:
print(cur.val,end=' ')
cur = cur.next
print(cur.val)
def add(self,value):
cur = self.head
node = ListNode(value)
if self.is_empty():
self.head = node
node.next = node
else:
# self.head = node
# node.next = cur
while cur.next!=self.head:
cur = cur.next
node.next = self.head
self.head = node
cur.next = node
def append(self,value):
cur = self.head
node = ListNode(value)
if self.is_empty():
self.add(value)
else:
while cur.next!=self.head:
cur = cur.next
node.next = self.head
cur.next = node
def insert(self,pos,value):
count = 1
cur = self.head
node = ListNode(value)
if self.is_empty() or pos<=1:
self.add(value)
elif pos>=self.__len__():
self.append(value)
else:
while count<pos-1 and count<self.__len__() -1:
count += 1
cur = cur.next
node.next = cur.next
cur.next = node
def remove(self,value):
pre = cur = self.head
if self.is_empty():
return
elif cur.val == value:
while cur.next!=self.head:
cur = cur.next
self.head = pre.next
cur.next = pre.next
while cur.next!=self.head:
if cur.next.val == value:
cur.next = cur.next.next
break
else:
cur = cur.next
def remove_pos(self,pos):
count = 1
pre = cur = self.head
if self.is_empty():
return
elif pos<=1:
while cur.next!=self.head:
cur = cur.next
self.head = pre.next
cur.next = pre.next
return
else:
while count<pos-1 and count<self.__len__()-1:
count += 1
cur = cur.next
if pos>=self.__len__():
cur.next = self.head
else:
cur.next = cur.next.next
def search(self,value):
count = 1
cur = self.head
if self.is_empty():
print('%s不存在链表'%value)
return
while cur.next!=self.head:
if cur.val == value:
print('%s位于链表中,为%d号节点'%(value,count))
return
else:
count += 1
cur = cur.next
if cur.val == value:
print('%s位于链表中,为%d号节点'%(value,count))
else:
print('%s不存在链表'%value)
def clear(self):
self.head = None
双向链表
class ListNode():
def __init__(self,val,next=None,prev=None):
self.val = val
self.next = next
self.prev = prev
class DoubleLinkList():
def __init__(self):
self.head = None
def is_empty(self):
"判断链表是否为空"
return self.head is None
def __len__(self):
"获取链表长度"
count = 0
cur = self.head
while cur!=None:
count += 1
cur = cur.next
return count
def travel(self):
"遍历链表"
cur = self.head
while cur!=None:
print(cur.val,end=' ')
cur = cur.next
print()
def add(self,value):
"头部添加节点"
node = ListNode(value)
if self.is_empty():
self.head = node
else:
node.next = self.head
self.head.prev = node
self.head = node
def append(self,value):
"尾部添加节点"
node = ListNode(value)
cur = self.head
if self.is_empty():
self.add(value)
else:
while cur.next!=None:
cur = cur.next
cur.next = node
node.prev = cur
def insert(self,pos,value):
"指定位置添加节点"
count = 1
cur = self.head
node = ListNode(value)
if self.is_empty() or pos<=1:
self.add(value)
elif pos>=self.__len__():
self.append(value)
else:
while count<pos and count<self.__len__():
count += 1
cur = cur.next
node.next = cur
cur.prev.next = node
node.prev = cur.prev
cur.prev = node
def remove(self,value):
"删除指定值节点"
cur = self.head
if self.is_empty():return
if cur.val == value:
self.head = cur.next
return
while cur!=None:
if cur.val == value:
cur.prev.next = cur.next
if cur.next:
cur.next.prev = cur.prev
break
else:
cur = cur.next
def remove_pos(self,pos):
"指定位置删除节点"
count = 1
cur = self.head
if self.is_empty() or pos<=1:
self.head = cur.next
if cur.next:
cur.next.prev = None
return
while count<pos and count<self.__len__():
count += 1
cur = cur.next
if pos>=self.__len__():
cur.prev.next = None
else:
cur.prev.next = cur.next
cur.next.prev = cur.prev
def search(self,value):
"查找节点"
count = 1
cur = self.head
while cur!=None:
if cur.val == value:
print('%s位于链表中,为%d号节点'%(value,count))
return
else:
count += 1
cur = cur.next
print('%s不存在链表'%value)
def clear(self):
"清空链表"
self.head = None
双向循环链表
class ListNode():
def __init__(self,val,prev=None,next=None):
self.val = val
self.prev = prev
self.next = next
class DoubleCycleList():
def __init__(self,head=None,node=None):
self.head = head
if node:
node.next = node
node.prev = node
def is_empty(self):
"判断链表是否为空"
return self.head is None
def __len__(self):
"获取链表长度"
cur = self.head
count = 1
if self.is_empty():
return 0
while cur.next!=self.head:
count += 1
cur = cur.next
return count
def travel(self):
cur = self.head
if self.is_empty():
return
else:
while cur.next!=self.head:
print(cur.val,end=' ')
cur = cur.next
print(cur.val)
def add(self,value):
"头部添加节点"
node = ListNode(value)
cur = self.head
if self.is_empty():
self.head = node
node.prev = node
node.next = node
else:
while cur.next!=self.head:
cur = cur.next
node.next = self.head
self.head.prev = node
self.head = node
node.prev = cur
cur.next = node
def append(self,value):
"尾部添加节点"
node = ListNode(value)
cur = self.head
if self.is_empty():
self.add(value)
else:
while cur.next!=self.head:
cur = cur.next
cur.next = node
node.prev = cur
node.next = self.head
self.head.prev = node
def insert(self,pos,value):
"指定位置插入节点"
node = ListNode(value)
cur = self.head
count = 1
if self.is_empty() or pos<=1:
self.add(value)
return
elif pos>=self.__len__():
self.append(value)
return
while count<pos and count<self.__len__():
cur = cur.next
count += 1
node.next = cur
cur.prev.next = node
node.prev = cur.prev
cur.prev = node
def remove(self,value):
"删除指定值节点"
cur = self.head
if self.is_empty():
return
if cur.val == value:
while cur.next!=self.head:
cur = cur.next
cur.next = self.head.next
self.head.next.prev = cur
self.head = self.head.next
return
while cur.next!=self.head:
if cur.val == value:
cur.prev.next = cur.next
cur.next.prev = cur.prev
return
else:
cur = cur.next
if cur.val == value:
cur.prev.next = self.head
self.head.prev = cur.prev
def remove_pos(self,pos):
"指定位置删除节点"
count = 1
cur = self.head
if self.is_empty():
return
if self.__len__() == 1:
self.head = None
return
elif pos<=1:
while cur.next!=self.head:
cur = cur.next
cur.next = self.head.next
self.head.next.prev = cur
self.head = self.head.next
return
while count<pos and count<self.__len__():
cur = cur.next
count += 1
if pos>=self.__len__():
cur.prev.next = self.head
self.head.prev = cur.prev
else:
cur.prev.next = cur.next
cur.next.prev = cur.prev
def search(self,value):
"查找节点是否存在"
count = 1
cur = self.head
if self.is_empty():
print('%s不存在链表'%value)
return
while cur.next!=self.head:
if cur.val == value:
print('%s位于链表中,为%d号节点'%(value,count))
return
else:
cur = cur.next
count += 1
if cur.val == value:
print('%s位于链表中,为%d号节点'%(value,count))
else:
print('%s不存在链表'%value)
def clear(self):
self.head = None