链表知识拙见:
数据在计算机中的存储方式,可以分为顺序存储和链式存储
什么是链式存储?
是使用不连续的存储空间来存放结构中的数据,将每个元素构造成一个节点,节点中除了存放元素本身外,还需要存放下一个节点的地址。
优点:
1) 提高空间的使用率
2) 任意位置增加或者删除数据时操作方便
缺点:
1) 总体的空间开销比顺序存储要大
2) 不方便随机的存取元素
特征:
1. 每一个数据放在一个独立的存储区
2. 保证结构中任一结点可以找到与其相关联的结点
3. 前一节点用链接方式显示的记录下一个节点之间的关联
链表分为单链表和双链表
单链表:
1) 其每个节点包含数据元素
2) 每个结点保存指向下一结点的链接
3) 链表的尾节点的链接域为空,None
双链表:
1) 其每个节点包含数据元素
2) 每个结点保存指向下一结点的链接
3) 每个结点保存指向前一结点的链接
4) 链表的首节点的上一节点链接域为空,None
5) 链表的尾节点的下一结点链接域为空,None
单向链表与双向链表实现有相似之处,双向链表代码示例:
# 链表节点
class Node:
def __init__(self,elem):
self._elem = elem
self._next = None
self._prev = None
# 链表类
class Dlink:
def __init__(self):
self._head = None
# 判空
def is_empty(self):
return self._head == None
# 插入链表
def add(self,elem):
# 创建新节点
tmp = Node(elem)
if self.is_empty():
# 空链表
self._head = tmp
else:
# 非空链表
cur = self._head
tmp._next = cur
cur._prev = tmp
self._head = tmp
# 遍历显示
def show(self):
cur = self._head
while cur:
print(cur._elem)
cur = cur._next
# 删除链表中的元素
def delete(self, data):
cur, pre = self._head, None
if not cur:
# 如果没有数据,但仍在删除就返回
return
net = cur._next
while cur:
# 是否找到数据
if cur._elem == data:
if pre == None:
# 首节点
self._head = net
cur._next = None
# 判断链表中是否只有1个数据
if net:
net._prev = None
break
elif net == None:
# 尾节点
pre._next = None
cur._prev = None
break
else:
# 中间节点
pre._next = net
net._prev = pre
break
# 没有找到数据时
elif not cur:
break
# 遍历节点
else:
pre = cur # 把当前节点赋值给pre
cur = net # 把下一个节点赋值给cur
if cur: # 判断是否为真
net = cur._next
# 链表长度
def len(self):
cur = self._head
num = 0
while cur:
num += 1
cur = cur._next
return num
if __name__ == '__main__':
mylink = Dlink()
# 插入数据
mylink.add('xiaoyang')
mylink.add('xiaoli')
mylink.add('xiaohei')
mylink.show()
print('-'*50)
mylink.delete('1') # 删除不存在的元素
mylink.show()
print(mylink.len())