顺序表:
1.完整的顺序表包含:元素集合和整体情况的信息
整体情况的信息:容量和元素个数
2.顺序表的存储结构:一体式和分离式(元素外置)
3.元素存储区域扩充:两种策略:固定数目(节省空间)和倍增(减少扩充次数),
推荐倍增方式-->以空间换时间
4.顺序表的删除和增加:
头部删除(O(n))和表尾删除(O(1))、
表头增加(O(n))和表尾增加(O(1))
5.python中的顺序表怎么实现的
列表采用分离式的动态顺序表,列表的id相当于顺序表的表头
6.python列表逆置相关的时间复杂度:(O(n/2)-->O(n))
7.顺序表和链表的不同:
顺序表:将元素顺序的存放在连续的存储区域,元素间的顺序关系由存储顺序自然表示
链表:将元素存放在通过链接构造起来的存储块中
8.链表
链表的特点:可以充分利用存储空间,实现灵活的内存动态管理
链表的结构:元素区(存取元素)和链接区(下一个节点的地址信息)
单链表的节点:前驱节点--头结点--后继结点--尾节点(指向空值)
9.Python中的指向问题 : a=100,b=a, 相当于b指向100
10.python中节点的指向问题:
1ext=node ,node--->[ item][ next]:next指向节点的这个存储地址node,
可以通过next.item 或者next.next来获取它的存取元素或下一个节点的位置
11.单向链表:
定义的类和异常都使用大驼峰命名
基本步骤:
1.创建结点类
2.单链表的实现
3.头部添加元素
4.尾部添加元素
5.指定位置添加元素
6.删除结点
7.查询结点是否存在
8.测试程序
源程序:
class Node(object):
"""结点类"""
def __init__(self, item):
self.item = item
self.next = None
class SingleLinkList(object):
"""单链表"""
def __init__(self, node=None):
self.__head = node
def is_empty(self):
"""链表是否为空
:return 如果链表为空 返回真
"""
return self.__head is None
def length(self):
"""链表长度"""
cur = self.__head
count = 0
while cur is not None:
count += 1
cur = cur.next
return count
def travel(self):
"""遍历整个链表"""
cur = self.__head
while cur is not None:
print(cur.item, end=" ")
cur = cur.next
print("")
def add(self, item):
"""链表头部添加元素
:param item: 要保存的具体数据
"""
node = Node(item)
node.next = self.__head
self.__head = node
def append(self, item):
"""链表尾部添加元素"""
node = Node(item)
# 如果链表为空,需要特殊处理
if self.is_empty():
self.__head = node
else:
cur = self.__head
while cur.next is not None:
cur = cur.next
# 退出循环的时候,cur指向的尾结点
cur.next = node
def insert(self, pos, item):
"""指定位置添加元素"""
# 在头部添加元素
if pos <= 0:
self.add(item)
# 在尾部添加元素
elif pos >= self.length():
self.append(item)
else:
cur = self.__head
count = 0
while count < (pos - 1):
count += 1
cur = cur.next
# 退出循环的时候,cur指向pos的前一个位置
node = Node(item)
node.next = cur.next
cur.next = node
def remove(self, item):
"""删除节点"""
cur = self.__head
pre = None
while cur is not None:
# 找到了要删除的元素
if cur.item == item:
# 在头部找到了元素
if cur == self.__head:
self.__head = cur.next
else:
pre.next = cur.next
return
# 不是要找的元素,移动游标
pre = cur
cur = cur.next
def search(self, item):
"""查找节点是否存在"""
cur = self.__head
while cur is not None:
if cur.item == item:
return True
cur = cur.next
return False
if __name__ == '__main__':
ll = SingleLinkList()
print(ll.length())
ll.travel()
ll.append(1) # 1
print(ll.length())
ll.travel()
ll.append(2) # 1 2
ll.travel()
ll.add(3) # 3 1 2
ll.travel()
ll.insert(0, 4) # 4 3 1 2
ll.travel()
ll.insert(19, 5) # 4 3 1 2 5
ll.travel()
ll.insert(2, 6) # 4 3 6 1 2 5
ll.travel()
ll.remove(4) # 3 6 1 2 5
ll.travel()
ll.remove(5) # 3 6 1 2
ll.travel()
ll.remove(6) # 3 1 2
ll.travel()
ll.remove(3) # 1 2
ll.travel()
ll.remove(2) # 1
ll.travel()
ll.remove(1) #
ll.travel()