Python链表基础及实现

本文介绍如何使用单链表实现LRU缓存机制,包括缓存更新、插入和删除操作。同时,探讨了链表回文的判断方法,通过字符串拼接比较正反序来验证链表是否为回文结构。
  • 手写代码单链表实现LRUCache
    lRUCache是最近最短使用的Cache缓存机制
#使用单链表实现lru_cache机制
#分为两种情况
#1.如果此数据之前已经被缓存到链表中了,遍历得到此节点并删除,然后插入到链表的头部。
#2.如果此数据之前没有被缓存到链表中,分为两种情况:
#	当缓冲没有满时,直接将其插入到头部
#	当缓存满时,将链表尾部节点删除并插入到头部
class LinkList(object):
	def __init__(self,val = None):
		self.val = val
		self.next = None

class LRUCache(object):
	def __init__(self,capicity):
		self.cap = capicity
		self.top = LinkList()
		self.hsmap = {}

	def get(self, val : int):
		if val in self.hsmap.keys():
			cur_pre = self.top
			while cur_pre.next != self.hsmap[val]:
				cur_pre = cur_pre.next
			# 删除节点并将其插入到链表头部
			cur = cur_pre.next
			cur_pre.next = cur.next
			cur.next = self.top.next
			self.top.next = cur

		else:
			# 增加新节点到首部
			cur = LinkList(val)
			cur.next = self.top.next
			self.top.next = cur
			self.hsmap[val] = cur

			if len(self.hsmap.keys()) > self.cap:
				# 删除尾节点
				del_node_pre = self.top
				while del_node_pre.next.next != None:
					del_node_pre = del_node_pre.next
				self.hsmap.pop(del_node_pre.next.val)
				del_node_pre.next = None


	def __repr__(self):
		result = ''

		cur = self.top.next
		while cur != None:
			result += (str(cur.val) + '->')
			cur = cur.next
		if not result:
			return result
		else:
			return result[:-2]

	def __len__(self) -> int:
		return len(self.hsmap.keys())

def main():
	lru = LRUCache(2)
	lru.get(1)
	print(lru)
	lru.get(2)
	print(lru)
	lru.get(1)
	print(lru) # 查看顺序是否更新
	lru.get(3)
	print(lru) # 是否删除节点


if __name__ == '__main__':
	main()
  • 判断列表是否回文
# 创建一个多链表并判断是否是回文

class Linklist(object):
	def __init__(self,val = 1):
		self.val = val
		self.next = None

def insert_node(l : Linklist,val : int) -> Linklist:
	# 向链表中插入节点
	top = l
	while top.next != None:
		top = top.next
	top.next = Linklist(val)
	return l

def is_palindrome(l : Linklist) -> bool:
	s = ''
	if l.next == None:
		return False
	elif l.next.next == None:
		return str(l.next.val)
	cur = l.next
	while cur != None:
		s += str(cur.val)
		cur = cur.next 
	return s == s[::-1]

def main():
	dummyhead = Linklist()
	for i in range(10):
		insert_node(dummyhead,i)
	for i in range(9,-1,-1):
		insert_node(dummyhead,i)
	print(is_palindrome(dummyhead))


if __name__ == '__main__':
	main()
  • 检查链表运行正确的边界条件
1.如果链表为空时,代码是否正确工作
2.如果链表只包含一个节点是否能工作
3.如果链表只包含两个节点是否能工作
4.代码逻辑在处理头节点和为尾节点时是否能工作
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值