单向链表
每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
实现
- 举例引入
a=10
b=20
a,b=b,a #交换变量的值
- 本质:Python中a=10,并不是在内存a中存储10,而是在内存a中存储元素10的位置,并指向另一块已经存储元素10的区域;a,b=b,a 代表内存a和内存b改变指向,不改变元素存储的位置,从而达到交换的效果。
- 推广:“=” 在Python中表示 “指向和链接”
- 节点实现
#创造单链表的结点
class Node(object):
def __init__(self,elem): # 初始化对象
self.elem = elem # elem存放数据元素
self.next = None # next是下一个节点的标识
node = Node(100) # node=self;elem=100
- 单链表的实现
class SingleLinkList(object): #创建单链表的类
def __init__(self):
self._head = None #设置初始的表头,_head是仅供内部使用
#或者
self.__head = node #表头指向创建好的节点
def is_empty(self): #创造“判断是否为空”的对象操作
return self._head == None # 输出判断结果
def length(self): #创造“列表长度”的对象操作
#引入辅助指针Cur,指的是Cur和self._head一同指向第一个节点
Cur = self.__head
count = 0 # count记录数量
while Cur != None: #不能是Cur.next != None, 否则少1
count += 1
cur = cur.next #指针移动
return count
def travel(self): #创造“遍历整个列表”的对象操作
Cur = self._head #游标 = 起始节点
while Cur != None:
print(cur.elem,end=" ") #end=" ",表示不换行
cur=cur.next
def add(self,item): #头部添加数据 O(1)
node = Node(item) #元素封装成节点
node.next = self.__head #整个单链不丢掉,先将新节点和后面链接
self.__head = node #不需要考虑链表为空的情况
def append(self,item): #尾部添加数据 O(n)
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): #指定位置添加数据 O(n)
if pos <= 0:
self.add(item)
elif pos > self.length()-1
self.append(item)
else:
pre=self.__head #pre游标指向第一个元素
count = 0
while count < (pos-1):
count+=1
pre = pre.next
node=Node(item) # 当循环退出后,pre指向pos-1位置
node.next = pre.next
pre.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 #空链直接返回False
while cur != None
if cur.elem == item:
return True
else:
cur=cur.next
return False
single_obj = SingleLinkList() #构建具体的单链表对象 相似与li=list()