为什么使用链表
链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
链表的定义
链表(Linked List )是一种很常见的数据结构,链表也是一种线性表,他不像顺序表一样连续存储,而是在每个数据节点上会存放下一个节点的地址信息,通过这样的方式把每个数据节点链接起来。
单向链表
单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
- 表元素域elem用来存放具体的数据。
- 链接域next用来存放下一个节点的位置(python中的标识)
- 变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。
节点实现
class SingleNode(object):
#单链表的节点
def __init__(self,item):
# _item存放数据元素
self.item=item
# _next是下一个节点的标识
self.next=None
单链表的操作
- is_empty() 链表是否为空
- length() 链表长度
- travel() 遍历整个链表
- add(item) 链表头部添加元素
- append(item) 链表尾部添加元素
- insert(pos, item) 指定位置添加元素
- remove(item) 删除节点
- search(item) 查找节点是否存在
单链表的实现
class SingleLinkList(object):
#初始化,定义好头结点
def __init__(self):
self.__head=None
#判断链表是否为空
def is_empty(self):
return seif.__head is None
def length(self):
"""链表长度"""
count=0
cur=self.__head
while cur != None:
count+=1
cur=cur.next
return count
def travel(self):
"""遍历链表"""
cur=self.__head
while cur!=None:
print (cur.item,end=" ")
cur=cur.next
头部添加元素
def add(self, item):
"""头部添加元素"""
node=SingleNode(item)
# 将新节点的链接域next指向头节点,即_head指向的位置
node.next=self.head.next
# 将链表的头_head指向新节点
self.head=node
尾部添加元素
def append(self, item):
"""尾部添加元素"""
node=SingleNode(item)
# 先判断链表是否为空,若是空链表,则将_head指向新节点
if self.is_empty():
self.head=node
# 若不为空,则找到尾部,将尾节点的next指向新节点
else:
cur=self.head
while cur.next !=None
cur=cur.next
cur.next=node
指定位置添加元素
def insert(self, pos, item):
"""指定位置添加元素"""
# 若指定位置pos为第一个元素之前,则执行头部插入
if pos<=0:
self add(item)
# 若指定位置超过链表尾部,则执行尾部插入
elif pos>=(self.length()-1):
self.append(item)
# 找到指定位置
else:
node=SingleNode(item)
count=0
pre=self.__head
while count<(pos-1):
count+=1
pre=pre.next
node.next=pre.next
pre.next=node
删除节点
def remove(self,item):
"""删除节点"""