1.单向循环列表
操作:
单链表的操作:
is_empth() 链表是否为空
length() 遍历整个链表
add(item)链表头部添加元素
append(item)链表尾部添加元素
insert(pos.item)指定位置添加元素
remove(item)删除节点
search(item)查找节点是否存在
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: JMS
@file: my05.py
@time: 2022/05/11
@desc:
"""
class Node(object): #节点
def __init__(self,elem):
self.element=elem
self.next=None
##用元组也可以实现(elm,None)
###定义链表的数据结构,实现单链表的操作
class SingleCycleLinkList(object):
###单链表
def __init__(self,node=None):
self.__head=node
if node:
node.next=node
def is_empty(self):
return self.__head==None
def length(self):
#用cur游标,用来移动遍历节点
if self.is_empty():
return 0
count = 1
cur=self.__head
#count用来记录数量
while cur.next!=self.__head:
count+=1
cur=cur.next
return count
def travel(self):
cur=self.__head
if self.is_empty():
return
while cur.next==self.__head:
print(cur.element,end=' ')
cur=cur.next
##退出循环,cur指向尾结点,但尾结点的元素未打印
print(cur.element)
def add(self,item):
#头插法
node=Node(item)
if self.is_empty():
self.__head=node
node.next=node
else:
##多一次遍历的过程,把尾结点指向头结点
cur=self.__head
while cur.next!=self.__head:
cur=cur.next
##退出循环,cur指向尾结点,但尾结点的元素未打印
node.next=self.__head
self.__head=node
#cur.next=node也可以
cur.next=self.__head
#cur.next=self.__head 也可以
#方法二
#node.next=self.__head
#self.__head=node
#cur.next=node.next
#cur.next=node
def append(self,item):
#尾插法
node=Node(item)
if self.is_empty():
self.__head=node
node.next=node
else:
cur=self.__head
while cur.next!=self.__head:
cur=cur.next
cur.next=node
node.next=self.__head
def insert(self,pos,item):
#:param pos参数 从0开始索引
if pos<=0:
self.add(item)
elif pos>(self.length()-1):
self.append(item)
else:
pre=self.__head
count=0
while count<(pos-1):
count+=1
pre=pre.next
#当循环退出后,pre指向pos-1位置
node=Node(item)
node.next=pre.next
pre.next=node
def remove(self,item):
if self.is_empty():
return
cur=self.__head
pre=None
while cur.next!=self.__head:
if cur.element==item:
###先判断此节点是否为头结点
#头结点:pre=None or cur=sel.__head
if cur==self.__head:
###头结点的情况,找尾结点
rear=self.__head
while rear.next!=self.__head:
rear=rear.next
self.__head=cur.next
rear.next=self.__head
else: ##中间结点
pre.next=cur.next
return
else:
pre=cur
cur=cur.next
####退出循环代表尾结点
if cur.element==item:
if cur==self.__head:
##链表只有一个结点
self.__head=None
else:
pre.next = cur.next
#pre.next=self.__head
def search(self,item):
if self.is_empty():
return False
cur = self.__head
while cur.next!=self.__head:
if cur.element==item:
return True
else:
cur=cur.next
if cur.element==item:
return
return False
if __name__=="__main__":
ll=SingleCycleLinkList()
ll.add(3)
ll.add(99)
ll.travel()
# ll.remove(100)
2.栈与队列的概念
顺序表: 将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示。
链表:将元素存放在通过链接构造起来的一系列存储块中。
栈:存入数据元素、访问元素、删除元素。特点:在于只能允许在容器的一端进行加入数据和输出数据的运算。没有了位置概念,保证任何时候可以访问、删除的元素都是此前最后存入的元素。
由于栈数据结构只允许在一端进行操作,因而按照后进先出的原理运作。
队列:
队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表
队列是一种先进先出的线性表
3.栈的实现
用顺序表(list)来实现一个栈
栈的操作:
1.stack()创建一个新的空栈
2.push(item)添加一个新的元素item到栈顶
3.pop()弹出栈顶元素
4.peek()返回栈顶元素
5.is_empty()判断栈是否为空
6.size()返回栈的元素个数
class Stack(object):
def __init__(self):
self.__list=[]
###栈
def push(self,item):
self.__list.append(item) ##对于列表,从尾部操作,单链表,从头部操作,达到时间复杂度最低
def pop(self):
return self.__list.pop()
def peek(self):
if self.__list:
return self.__list[-1]
else:
return None
def is_empty(self):
return self.__list==[]
##计算return右边的值
#return not self.__list
def size(self):
return len(self.__list)
if __name__=="__main__":
s=Stack()
s.push(1)
s.push(2)
s.push(3)
s.push(4)
print(s.pop())
4.队列与双端队列的实现
操作:
Queue()创建一个空的队列
enqueue(item)往队列中添加一个item元素
dequeue()从队列头部删除一个元素
is_empty()判断一个队列是否为空
size()返回队列的大小
class Queue(object):
'''队列'''
def __init__(self):
self.__list=[]
def enqueue(self,item):
self.__list.append(item) #self.__list.insert(0,item) return self.pop()
##取决于入队和出队哪个操作更频繁
def dequeue(self):
return self.__list.pop(0)
def is_emppty(self):
return self.__list==[]
def size(self):
return len(self.__list)
if __name__=="__main__":
s = Queue()
s.enqueue(1)
s.enqueue(2)
s.enqueue(3)
s.enqueue(4)
print(s.dequeue())
5.双端队列
双端队列是一种具有列队和栈的性质的数据结构
双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双端队列可以再队列任意一端入队和出队。
操作:
class Deque(object):
'''队列'''
def __init__(self):
self.__list=[]
def add_front(self,item):
elf.__list.insert(0, item)
def add_rear(self, item):
self.__list.append(item) #self.__list.insert(0,item) return self.pop()
##取决于入队和出队哪个操作更频繁
def pop_front(self):
return self.__list.pop(0)
def pop_rear(self):
return self.__list.pop()
def is_emppty(self):
return self.__list==[]
def size(self):
return len(self.__list)