IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Python LinkedList 单向链表基本实现 -> 正文阅读

[数据结构与算法]Python LinkedList 单向链表基本实现

作者:recommend-item-box type_blog clearfix

链表

链表,Linked List, 是一种非连续,非顺序的数据结构,由若干节点组成。(Node即为节点)

节点

单向链表每个节点包含两个部分。第一个部分用于存放数据变量data,第二个部分则是指针next,用于指向下一个节点。

存储方式

链表的存储方式为随机存储,链表的每一个节点分布在内存的不同位置,靠指针关联。

时间复杂度

查找更新插入删除
链表O(n)O(1)O(1)O(1)

优缺点

优点:从存储方式可以看出,链表内存利用率比数组高,数组需要在内存中占用连续完整的储存空间。从上面的时间复杂度可以看出,链表可以灵活的插入或者删除,适合大量添加/删除工作。
缺点:定位元素慢,只能通过遍历整个链表查找

代码实现

# Node
class Node(object):
	def __init__(self, data):
		self.data = data
		self.next = None


# 单向链表
class LinkedList(object):
	"""
	1. init()								初始化无node
	2. is_empty()	# return True/False		是否为空链表
	3. get(index) # return node 			根据下标获取节点
	4. get_node(data) # return node			根据节点数据获取节点
	5. get_index(data) # retrun index		根据节点数据获取下标
	6. insert(node, index) 					插入node到指定位置
	7. add(node)							头插入
	8. append(node)							尾插入
	9. update(data, index)					根据节点下标更新节点数据
	9. travel()								遍历并打印所有node
	10. remove(index) # return node 		删除指定位置node
	11. extend(LinkedList)					合并链表
	12. clear()								清空链表
	"""
	def __init__(self):
		""" 初始化无node """	
		self.size = 0
		self.head = None
		self.tail = None

	def is_empty(self):
		""" 判定是否为空链表 """
		return self.head == None

	def get(self, index):
		""" 查找指定位置节点 """	
		if index < 0 or index >= self.size:
			raise Exception("over range!")
		p = self.head
		for i in range(index):
			p = p.next
		return p 

	def get_node(self, data):
		""" 根据节点数据获取节点 """
		p = self.head
		for i in range(self.size):
			if p.data == data:
				return p
			else:
				p = p.next
		print("The data is not in LinkedList!")

	def get_index(self, data):
		""" 根据节点数据获取第一个出现的节点下标 """
		p = self.head
		for i in range(self.size):
			if p.data == data:
				return i
			else:
				p = p.next
		print("The data is not in LinkedList!")

	def insert(self, node, index):
		""" 插入指定位置节点 """
		if index < 0 or index > self.size:
			raise Exception("over range!")

		if self.size == 0:
			# 空链表
			self.head = node
			self.tail = node
		elif index == 0:  
			# 插入头部
			node.next = self.head
			self.head = node
		elif self.size == index:  
			# 插入尾部
			self.tail.next = node
			self.tail = node
		else:  
			# 插入中间
			prev_node = self.get(index-1)
			node.next = prev_node.next
			prev_node.next = node 

		self.size += 1

	def add(self, node):
		""" 头插入 """
		self.insert(node, 0)

	def append(self, node):
		""" 尾插入 """
		self.insert(node,self.size)

	def update(self, data, index):
		""" 根据节点下标更新节点数据 """
		if index <0 or index >= self.size:
			raise Exception("over range!")
		if index == 0:
			self.head.data = data
		elif index == self.size-1:
			self.tail.data = data
		else:
			p = self.head
			for i in range(index):
				p = p.next
			p.data= data

	def travel(self):
		""" 遍历并打印 """
		p = self.head
		if self.size == 0:
			print("No Data!")
		else:
			while (p != None):
				print(p.data)
				p = p.next

	def remove(self, index):
		""" 删除指定节点 """
		if index <0 or index >= self.size:
			raise Exception("over range!")

		# 需要暂存被删除节点进行返回
		if index == 0:  
			# 删除头节点
			removed_node = self.head
			self.head = self.head.next
		elif index == self.size-1:  
			# 删除尾节点
			prev_node = self.get(index-1)
			removed_node = self.tail
			prev_node.next = None
			self.tail = prev_node
		else:
			# 删除中间节点
			prev_node = self.get(index-1)
			next_node = prev_node.next.next
			removed_node = prev_node.next 
			prev_node.next = next_node

		self.size -= 1
		return removed_node

	def extend(self, item):
		""" 合并两个链表 """
		if item.is_empty():
			raise Exception("LinkedList is empty!")

		self.tail.next = item.head
		self.tail = item.tail
		self.size += item.size

	def clear(self):
		""" 清空链表 """
		self.head = None 
		self.tail = None
		self.size = 0
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 14:50:26  更:2021-07-29 14:50:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 14:24:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码