数据结构与算法
二,链式结构
特点:内存不连续 下标无法访问 append容易 遍历难(必须从左边开始遍历,一个一个的遍历)
1.单链表:有一个root节点,是链表的入口,单链表有两个值分别为value,next , next用于指向下一个节点
数据属性:root,length
方法:init,append,appendleft,iter_node,remover,find,popleft,clear
操作的时间复杂度:
append O(1)
appendleft O(1)
find O(n)
remover O(n)
用python实现一个单链表 linkes
#Node节点用于定义每一个元素
class Node(object):
def __init__(self,value = None,next = None):
self.value , self.next = value,next
#实现方法
class linkes(object):
#首先给他一个最大的长度,None是可以无限扩充的
def __init__(self,maxsize = None):
self.maxsize = maxsize
#根节点,进入Node的节点
self.root = Node()
#长度默认为零
self.length = 0
#添加一个next用于记录最后一个节点
self.tailnode = None
def __len__(self):
return self.length
#从右边插入一个值
def append(self,value):
#判断是否超出了链表的最大长度
if self.maxsize is not None and len(self) > self.maxsize:
#如果超出了就返回一个异常
raise Exception('Full')
#构造一个新的节点 赋值为value
node = Node(value)
#取到最后一个节点的next
tailnode = self.tailnode
#判断这个节点是不是None
if tailnode is Node:
#如果是就把root的节点指向当前节点
self.root.next = node
#如果不是
else:
#就把最后一个节点指向前一个节点
tailnode.next = next
#更新最后一个节点
self.tailnode = node
#长度加一
self.lenght += 1
#往左边插入节点
def appendleft(self,value):
#先定义一个头节点
headnode = self.root.next
#新建一个节点
node = Node(value)
#当前的下一个节点指向头节点
node.next = headnode
#长度加一
self.length += 1
#遍历操作
def iter_node(self):
#从根节点的下一个节点开始遍历
curnode = self.root.next
#只要这个节点不是尾节点
while curnode is not self.tailnode:
#生成当前节点
yield curnode
#更新节点
curnode = curnode.next
#生成最后一个节点
yield curnode
#遍历操作
def __iter__(self):
#只要node在iter_node中生就取出他的value
for node in self.iter_node():
yield node.value
#删除
def remove(self,value):
#根节点
prevnode: Node = self.root
#当前的节点,从首节点开始
curnode = self.root.next
#遍历
for curnode in self.iter_node():
#如果参数==value
if curnode.value == value:
#把上一个节点的尾元素指向下一个元素
prevnode.next = curnode.next
if curnode is self.tailnode:
self.tailnode = prevnode
#删除当前节点
del curnode
#长度减一
self.length -= 1
return 1
#查找
def find (self,value):
#链表中的第几个元素
index = 0
#
for node in self.iter_node():
#如果他的值等于参数value
if node.value == value:
#返回这个index
return index
#否则index递增
index +=1
return -1
#弹出第一个节点
def popleft(self):
#如果root.next为空就报一个异常
if self.root.next is Node:
raise Exception('pop from empty LinkedList')
#头节点
headnode = self.root.next
#把root的节点的下一个节点
self.root.next = headnode.next
#长度减一
self.length -= 1
value = headnode.next
#删除头节点
del headnode
#返回value值
return value
#清空链表
for node in self.iter_node():
del node
self.root.next = None
self.lenght = 0