#创建节点类
#一个节点需要两个内容:数据elem和下一个节点的地址
class Node(object):
'''节点类'''
def __init__(self,elem):
#数据区
self.elem = elem
#指针区
self.next = None
#创建单链表类
#需要创建节点,需要有操作单链表(实例)的方法
class SingleLinkList(object):
'''单链表'''
def __init__(self,node=None): #将节点传进来(使用默认参数,用户也可以不传,不传时相当于初始化一个空链表)
#头结点的指针self.__head,指向第一个节点,只要有头结点指针,就能找到后面的节点
#头节点不需要让外人使用(私有属性),且一开始可指向None
self.__head = node
def is_empty(self):
'''判断链表是否为空'''
#只要链表的头节点指向空,就是空链表
return self.__head == None
def length(self):
'''链表长度'''
#链表长度=节点的数量
#找一个第三方指针,记录当前访问到的位置
cur = self.__head #第一步:让cur游标和头节点指针一样,指头结点
#第二步:cur指针,用来遍历移动遍历节点
count = 0 #计数,count就代表链表长度
while cur != None: #当指针指向的下一个为None时,表示遍历到了最后,循环结束
count += 1
cur = cur.next
return count
def travle(self):
'''遍历整个链表'''
cur = self.__head
while cur != None:
print(cur.elem,end=' ') #打印出元素值,以空格连接
print(' ') #每次遍历后打个空格换行,因为Print()默认为换行
def add(self,item): #时间复杂度为 O(1)
'''链表头部添加元素,头插法'''
#先让新节点指向第一个节点,再让投节点指向新节点,这样就连起来了
#创建新节点
node = Node(item)
#让新节点的地址部分(next)指向原来的第一个节点的数据部分
node.next = self.__head
#将投节点指向新节点的数据部分
self.__head = node
def append(self,item): #item表示用户输入的数据,时间复杂度为O(n)
'''链表尾部添加元素,尾插法'''
#构造节点,在一个类的内部 实例化另一个类的对象
node = Node(item)
#如果向空链表中append,直接将投节点指向新节点
if self.is_empty():
self.__head = node
else:
cur = self.__head #让cur和头节点一样,指向第一个节点
while cur.next != None: #开始走路,一直走到最后
cur = cur.next
#当走到最后时,指向新的节点,就append了
cur.next = node
def insert(self,pos,item): #时间复杂度为O(n)
'''指定位置添加元素
:param pos 从0开始
'''
#如果用户输入的pos<=0,是头插法
if pos <= 0:
self.add(item)
#如果用户输入的pos>链表索引的最大值,认为是尾插法
elif pos > (self.length()-1):
self.append(item)
else:
#需要先改变新节点的指向,再改变原链表中节点的指向,以保证原有节点的连续性以免数据丢失
#需要有一个新的游标pre,指向要插入节点位置pos的前一个节点,以方便使用pre.next
pre = self.__head
count = 0
while count < (pos-1): #当移动到Pos前一个位置时停下来
count += 1
pre = pre.next
#当循环退出后,pre指向pos-1位置
#将新节点的地址区域指向要插入节点的值区域
node = Node(item)
node.next = pre.next
#将要插入位置节点的前一个节点的地址区域指向新节点的值区域
pre.next = node
def remove(self,item): #时间复杂度为O(n)
'''删除节点'''
#cur遍历找item,找到后将cur前一个节点的next(pre.next)指向后一个节点的elem(就是cur.next),给两个游标
cur = self.__head #先将cur指向第一个节点,pre指向none
pre = None
while cur != None
#如果cur指向的值等于item,则将pre.next指向cur.next
if cur.elem = item:
#先判断此节点是否是头节点或者是否自由一个节点
#如果是头节点或只有一个节点,self.__head指向cur.next
if cur == self.__head:
self.__head == cur.next
else:
pre.next = cur.next
break #删完就退出循环
#如果不是,就将pre和cur向后移继续查找
else:
pre = cur #pre向后移一步,指向现在cur指向的位置
cur = cur.next #cur再向后移动一步
def search(self,item):
'''查找节点是否存在,遍历链表,存在则返回True'''
cur = self.__head
#指针一边向后移,一边比较值是否相等
while cur != None:
if cur.elem == item:
return True
else:
cur = cur.next
#整个循环都没找到,返回False
return False
if __name__ == '__main__':
ll = SingleLinkList()
print(ll.is_empty())
print(ll.length())
ll.append(1)
print(ll.is_empty())
print(ll.length())
ll.add(8)
ll.insert(-1,8)
ll.trval() #遍历打印
ll.insert(1,9)
ll.trval() #遍历打印
ll.insert(10,5)
ll.trval() #遍历打印
ll.remove(100) #删除
ll.travel()
单链表 --python描述
最新推荐文章于 2020-08-07 19:35:51 发布