- 程序=数据结构+算法
- 算法是为解决实际问题而设计的,数据结构是算法需要处理的问题载体
线性表
- list列表中元素可以修改;而tuple元组中元素不可以修改
- 线性表:包括顺序表以及链表
链表
- 单向链表:每个节点包括一个信息域(元素域)和一个链接域(下一节点的指针位置)
- 单链表的操作
is_empty()
链表是否为空length()
链表长度travel()
遍历整个链表add()
链表头部添加元素append()
链表尾部添加元素insert(pos,item)
指定位置添加元素remove()
删除节点search()
查找节点是否存在
- 单链表的实现
class Node(object):
def __init__(self,elem): #构造函数 self 指对象
self.elem =elem
self.next =None
#node = Node()
class SingleLinkList(object):
def __init__(self, node=None):
self.__head = node #私有 双下划线
def is_empty(self):
return self.__head == None
def length(self):#链表长度
#cur游标,用来移动遍历节点
cur = self.__head
#count 记录数量
count = 0
while (cur!=None):
count +=1
cur = cur.next
return count
def travel(self): #遍历整个链表
#cur游标,用来移动遍历节点
cur = self.__head
while (cur!=None): #注意:这里与计算链表长度那里的循环条件不同,前者是cur.next,这里是cur
print (cur.elem)
cur = cur.next
def add(self, 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游标,用来移动遍历节点
cur = self.__head
while (cur.next!=None):
cur = cur.next
cur.next = node
def insert(self,pos,item): #指定位置添加元素
pass
def remove(self, item): #删除节点
pass
def search(self, item):# 查找节点是否存在
pass
if __name__ == "__main__":
ll = SingleLinkList()
print(ll.is_empty())
ll.append(1)
print(ll.is_empty())
print(ll.length())
ll.append(2)
ll.append(3)
ll.append(4)
ll.append(5)
ll.travel()
链表与顺序表的对比
- 顺序表:存取可以一次定位,存储连续
- 链表:对于离散的空间可以充分利用,存取需要从头遍历
操作 | 链表 | 顺序表 |
---|---|---|
访问元素 | O(n) | O(1) |
在头部插入/删除 | O(1) | O(n) |
在尾部插入/删除 | O(n) | O(1) |
在中间插入/删除 | O(n) | O(n) |
写在最后:这是第一篇博客,也算是从0开始。感恩路上所遇见的人,给与的温暖与帮助。剩下的,只能靠自己努力了。