链表为什么会存在?
顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充存储时有需要进行数据搬迁,所以使用起来不是很灵活。
链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
链表的定义:
链表(linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。
单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接则指向一个空值。
表元素域elem用来存放具体的数据
节点域next用来存放下一节点的位置
变量p指向链表的头节点(省节点)的位置,从p出发能找到表中的任意节点
class SingleNode(object):
def __init__(self,item):
self.elem=item
self.next=None
只需要把相应的表头变量设置为空链接,在python语言中将其设置为None。
应丢弃这个链表里的所有节点,这个操作与具体的语言环境有关。在Python语言中,只需要简单地将表指针赋值为None,就抛弃了链表原有的所有节点。Python解释器的存储管理系统会自动回收不用的存储。
将表头变量的值与空链接比较。在python语言中,就是检查相应变量的值是否为None。
class Node(object):
'''节点'''
def __init__(self,elem):
self.elem=elem
self.next=None
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 = self.__head
while cur != None:
print(cur.elem,end=' ')
cur = cur.next
print()
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 = self.__head
while cur.next != None:
cur = cur.next
cur.next = node
def insert(self, pos, item):
"""指定位置添加元素"""
if pos<=0:
self.add(item)
elif pos>=self.length()-1:
self.append(item)
else:
court=0
cur=self.__head
while court<(pos-1):
cur=cur.next
court+=1
node=Node(item)
node.next=cur.next
cur.next=node
def remove(self, item):
"""删除节点"""
cur=self.__head
pre=None
while cur!=None:
if cur.elem==item:
if cur==self.__head:
self.__head=cur.next
else:
pre.next=cur.next
break
else:
pre=cur
cur=cur.next
def search(self, item):
"""查找节点是否存在"""
cur=self.__head
while cur!=None:
if cur.elem==item:
return True
else:
cur=cur.next
return False
if __name__ == "__main__":
ll = SingleLinkList()
print(ll.is_empty())
创建空表:O(1)
删除表:在python里是O(1)
判断空表:O(1)
加入元素:
删除元素:
求表的长度:O(n)