链表定义:
在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。
链表与顺序表的区别:顺序表的存储空间必须连续
注意:链表是我们自行定义的存储结构,本质就是利用类定义描述其功能
ps:关于存储方式:
1.a=10—a表示一个地址,地址指向值
2.int a=10----a被确定为只能存整数,此时a表示存整数10 的单元
ps:类属性和对象属性区分
私有属性(内部函数使用,对外不暴露):书写时的惯用写法,前加下划线,比如链表的self._head
1.单向链表
·单向链表也叫单链表
·链表中最简单的一种形式
·结构:它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
·链接域next用来存放下一个节点的位置(python中的标识)
·变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。
**链表节点实现(存储单元的实现)–ADT模型:
模板:
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) 查找节点是否存在
例:单链表实现:
py2.7会加object参数,3以上就不加,直接写()
程序解释:
1.next=node之类表示区域指向区域,此处是next区域指向node区域
2.构造链表前,先写Node类,定义好节点,实例化一个节点后,将此节点作为初始化参数用给链表类,作为头节点,再 进一步连接节点形成链表
即:链表初始化需要传入的参数之一是节点
#python3
#qqyx
#SingleNode
class SingleNode(object):
"""单链表节点"""
def __init__(self,item):
self.item=item
self.next=None
#Singlelinklist
class Singlelinklist(object):
def __init__(self):
self._head=None
def is_empty(self):
"""链表是否为空"""
return self._head==None
def length(self):
"""链表长度"""
cur=self._head
count=0
while cur!=None:
count+=1
cur=cur.next
return count
def travel(self):
"""遍历整个链表"""
cur=self._head
while cur!=None:
print(cur.item)
cur=cur.next
print('\n')
def add(self,item):
"""链表头部添加元素"""
node=SingleNode(item)
node.next=self._head
self._head=node
def append(self,item):
"""链表尾部添加元素"""
node=SingleNode(item)
if self.is_empty():
self._head=node
else:
cur=self._head
while cur!=None:
cur=cur.next
cur=node
node.next=None
def insert(self,pos, item):
"""指定位置添加元素"""
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):
"""删除节点"""
cur = self._head
pre = None
while cur != None:
# 找到了指定元素
if cur.item == item:
# 如果第一个就是删除的节点
if not pre:
# 将头指针指向头节点的后一个节点
self._head = cur.next
else:
# 将删除位置前一个节点的next指向删除位置的后一个节点
pre.next = cur.next
break
else:
# 继续按链表后移节点
pre = cur
cur = cur.next
def search(self,item):
"""查找节点是否存在"""
cur = self._head
while cur != None:
if cur.item == item:
return True
cur = cur.next
return False
![在这里插入图片描述](https://img-blog.csdnimg.cn/c6845c3fac2440a9b8422dc054d2ab8c.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUyNzYyOTI3,size_16,color_FFFFFF,t_70)