算法 Part2 LL Stack

算法 Part2 LL Stack

知识点

  1. 链表,将元素放在将通过链接构造起来的一系列存储块中,是一种线性表。
  2. 链表的结构图示:
    在这里插入图片描述
  3. 单链表。
class Node:
	def __init__(self,elem):
		self.elem = elem
		self.next = None
class SingleLinklist:
	def __init__(self,node):
		self._head = node
	
	def is_empty(self):
		return not self._head
	
	def length(self):
		cnt,cur = 0,self._head
		while cur:
			cnt += 1
			cur = cur.next
		return cnt 
	
	def append(self,item):
		if not self._head:
			return Node(item)
		cur = self._head
		while cur.next:
			cur = cur.next
		cur.next = Node(item)
	
	def insert(self,pos,item):
		if pos <= 0:
			node = Node(item)
			node.next = self._head
			self._head = node
		cur = self._head
		cnt = 0
		while cnt<pos-1:
			if not cur.next:
				node = Node(item)
				node.next,cur.next = None,node
				return 
			cur = cur.next
			cnt += 1
		node = Node(item)
		node.next,cur.next = cur.next,node
	
	def remove(self,item):
		cur = self._head
		if cur.elem == item:
			cur = cur.next
		while cur and cur.next:
			if cur.next.elem == item:
				cur.next = cur.next.next
				break
			cur = cur.next

	def search(self,item):
		cur = self._head
		while cur:
			if cur.elem == item:
				return true
			else:
				cur = cur.next
		return False	
  1. 链表和顺序表的比较。
    在这里插入图片描述
    链表和顺序表是完全不同的操作,链表耗时主要是在遍历查找,删除和插入操作本身都是O(1)的,顺序表查找很快,主要耗时的操作是拷贝覆盖。
  2. 双向链表。
class node:
	def __init__(self,item):
		self.val = item
		self.next = None
		self.prev = None
class DoubleLinklist:
	def __init__(self,node = None):
		self._head = node
	def is_empty(self):
		return not self._head
	def length(self):
		cnt,cur = 0,self._head
		while cur:
			cnt += 1
			cur = cur.next
		return cnt 
	def add(self,item):
		node = Node(item)
		node.next = self._head
		self._head,node.next.prev = node,node
	def append(self,item):
		if not self._head:
			return Node(item)
		cur = self._head
		while cur.next:
			cur = cur.next
		node = Node(item)
		cur.next,node.prev = node,cur
	def insert(self,pos,item):
		if pos<=0:
			self.add(item)
		elif pos>(self.length()-1):
			self.append(item)
		else:
			cur = self._head
			cnt = 0
			while cnt<pos:
				cnt += 1
				cur = cur.next
			node = Node(item)
			node.next,node.prev = cur,cur.prev 
			cur.prev.next,cur.prev = node,node
	def remove(self,item):
		cur = self._head
		while cur:
			if cur.val == item:
				if cur == self._head:
					self._head = cur.next
					if cur.next:
						cur.next.prev = None
				else:
					cur.prev.next = cur.next
					if cur.next:
						cur.next.prev = cur.prev
				break
			else:
				cur = cur.next
  1. 单向循环链表(环)。
class RecurSingleLL:
	def __init__(self,node):
		self._head = node
		if node:
			node.next = node
	
	def add(self,item):
		node = Node(item)
		if not self._head:
			self._head =node
			node.next = node
			return 
		cur = self._head
		while cur.next:
			cur = cur.next
		node.next,self._head = self._head,node
		cur.next = self._head

	def append(self,item):
		node =Node(item)
		if not self._head:
			self._head =node
			node.next = node
			return 
		cur = self._head
		while cur.next != self._head:
			cur = cur.next
		cur.next,node.next = node,self._head

	def length(self):
		cur = self._head
		if not cur:
			return 0
		cnt = 1
		while cur.next != self._head:
			cnt += 1
			cur = cur.next
		return cnt
	
	def insert(self,pos,item):
		if pos<=0:
			self.add(item)
		elif pos>(self.length()-1):
			self.append(item)
		else:
			cur = self._head
			cnt = 0
			while cnt<pos:
				cnt += 1
				cur = cur.next
			node = Node(item)
			node.next,node.prev = cur,cur.prev 
			cur.prev.next,cur.prev = node,node
	
	def search(self,item):
		if not self._head: return False
		cur = self._head
		while cur.next!=self._head:
			if cur.val == item:
				retrun True
			cur = cur.next
		if cur.val == item:
			return True
		return False
	
	def remove(self,item):
		if not self._head: return
		cur = self._head
		pre = None
		while cur.next != self._head:
			if cur.val == item:
				if cur == self._head:
					rear = self._head
					while rear.next != self._head:
						rear = rear.next
					rear.next = self._head 
					self._head = cur.next
					return 
				else:
					pre.next = cur.next
					return
			else:
				pre,cur = cur,cur.next
		if cur.val == item:
			if cur == self._head:
				self._head = None
			else:
				pre.next = cur.next
  1. 总结上述方法中insert, remove方法最麻烦。
  2. 双向循环链表?
  3. 栈,描述的是操作,线性表描述的是数据如何存放。(LIFO),压栈也叫入栈。
class stackdef __init__(self):
		self._items = []
	
	def push(self,item):
		self.items.append(item)
		
	def pop(self,ind):
		self.items.pop()
	
	def peek(self):
		if not self._items: return None
		return self._items[-1]
	
	def size(self):
		return len(self._items)
  1. 队列与双端队列的实现。
class dequeue:
	def __init__(self):
		self._items = []
	def add(self,item):
		self._items.insert(0,item)
	def append(self,item):
		self._items.append(item)
	def pop_front(self):
		if not self._items: return None
		return self._items.pop(0)
	def pop_rear(self):
		if not self._items: return None
		return self._items.pop()
	def size(self):
		return len(self._items)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值