1. 链表(单链表、循环链表、双链表、循环双链表)的实现
1.1单链表
每一个节点由数据区及指向下一节点的指针域组成

#coding:utf-8
class SingleLinkedList(object):
"""链表类"""
__slots__ = ['_head', '_size']
class _Node(object):
"""节点类"""
__slots__ = ['data', 'next']
def __init__(self, data, next):
self.data = data
self.next = next
def __init__(self):
self._head = None
self._size = 0
def is_empty(self):
"""判断链表是否为空"""
return self._size==0
@property
def length(self):
return self._size
def insert(self, index: int, data):
"""任意位置数据插入"""
if index>self._size or index<0:
raise IndexError("out of index or invalid")
else:
cur_node = self._Node(data, None)
if self.is_empty():
self._head = cur_node
else:
node = self._head
count = 0
while node != None:
if index==0:
cur_node.next = node
self._head = cur_node
break
elif count==index-1 and index!=0:
cur_node.next = node.next
node.next = cur_node
break
count += 1
node = node.next
self._size += 1
def remove(self, index):
"""任意位置数据删除"""
if index>self._size or index<0:
raise IndexError("out of index or invalid")
else:
if self.is_empty():
raise Exception("This singleLinkedList is empty")
else:
node = self._head
count = 0
while node != None:
if index==0:
self._head = node.next
break
elif index!=0 and count+1==index:
node.next = node.next.next
break
count += 1
node = node.next
self._size -= 1
def __str__(self):
flag = "<-"
res = ""
node = self._head
while node != None:
if node.next==None:
res += '['+str(node.data)+']'
else:
res += ('['+str(node.data)+']'+flag)
node = node.next
return res
if __name__ == '__main__':
link = SingleLinkedList()
link.insert(0, 1)
link.insert(0, 0)
link.insert(1, 11)
link.insert(0, 22)
link.insert(0, 4)
link.insert(2, 8) # [4]<-[22]<-[8]<-[0]<-[11]<-[1]
link.remove(0) # [22]<-[8]<-[0]<-[11]<-[1]
link.remove(3) # [22]<-[8]<-[0]<-[1]
print(link)
1.2 循环单链表

循环链表的开始和结束没有特定的概念,其使用场景很丰富,对于一些轮转服务的场景很有效,例如指定某一个节点current,通过设置current = current.next,可以有效地遍历链表中每一个节点。

1.3双向链表

插入和删除操作:

2. 栈
2.1 单链表实现栈:
使用列表(list)来实现栈相对容易,这里我们使用链表来模拟栈的实现