Python数据结构实战——单向链表(LinkedList)
文章目录
- 1.定义结点类
- 2.定义链表类
- 2.1.打印整个链表
- 2.2.获取链表长度
- 2.3.链表头部插入元素
- 2.4.链表尾部插入元素
- 2.5.链表任意位置插入元素
- 2.6.链表任意位置删除元素
- 2.7.链表中插入一堆数据
- 2.8.链表中某一元素后插入值
- 2.9.链表中某一元素后删除值
- 3.完整代码+测试
1.定义结点类
class Node:def __init__(self,data=None,next=None): #传入值和指针self.data = data #data赋值self.next = next #next赋值
2.定义链表类
class LinkedList:def __init__(self):self.head = None #初始化头结点为None
下面将在链表类中封装处理链表的一系列操作。
2.1.打印整个链表
def print(self):if self.head is None: #链表为空print("Linked list is empty")return itr = self.head #itr指向头指针llstr = '' #初始化链表while itr:llstr += str(itr.data) + '-->' #拼接链表操作itr = itr.next #指针后移print(llstr) #遍历完链表后,打印
2.2.获取链表长度
def get_length(self):count = 0 itr = self.head #itr指向头指针while itr:count += 1 #计数itr = itr.next #指针后移return count #打印链表长度
2.3.链表头部插入元素
def insert_at_begining(self,data):node = Node(data, self.head) #实例化一个待插入的结点,该结点的指针指向头结点self.head = node #把实例化的新结点插在头结点上
2.4.链表尾部插入元素
def insert_at_end(self,data):if self.head is None: #当链表为空时,把实例化的结点做为头结点,注意此时结点也是为尾结点,故指针为Noneself.head = Node(data,None)return itr = self.head #itr指向头指针while itr.next: #依次遍历,直到当前链表的尾结点itr = itr.nextitr.next = Node(data,None) #实例化一个结点插到链表尾部,注意此时结点是尾结点,故指针为None
2.5.链表任意位置插入元素
def insert_at(self, index, data):if index < 0 or index > self.get_length(): #插入位置越界raise Exception("Invalid Index")if index == 0: #相当于在第一个位置插入结点self.insert_at_begining(data)returncount = 0itr = self.headwhile itr:if count == index-1: #在index前(即index-1处)插入结点node = Node(data, itr.next) #实例化一个新的结点,新的结点的指针指向当前itr的下一个结点itr.next = node #在当前itr后插入实例化的结点breakitr = itr.next count += 1
2.6.链表任意位置删除元素
def remove_at(self, index):if index<0 or index>=self.get_length(): #删除位置越界raise Exception("Invalid Index")if index == 0: #删除链表第一个结点self.head = self.head.next #只需把把头结点的指针往后移动一个即可returncount = 0itr = self.head while itr:if count == index-1: #找到待删除结点的上一个结点itr.next = itr.next.next #itr的指针指向它的下下个结点breakitr = itr.nextcount += 1
2.7.链表中插入一堆数据
def insert_values(self, data_list):self.head = Nonefor data in data_list: #依次插入data_list的每个元素 self.insert_at_end(data) #调用在尾部插入函数insert_at_end
2.8.链表中某一元素后插入值
def insert_after_value(self, data_after, data_to_insert):if self.head is None:return if self.head.data == data_after:self.head.next = Node(data_to_insert,self.head.next)return itr = self.headwhile itr:if itr.data == data_after:itr.next = Node(data_to_insert,itr.next)breakitr = itr.next
2.9.链表中某一元素后删除值
def remove_by_value(self, data):if self.head is None:returnif self.head.data == data:self.head = self.head.nextreturn itr = self.headwhile itr.next:if it.next.data == data:itr.next = itr.next.nextbreakitr = itr.next
3.完整代码+测试
class Node:def __init__(self,data=None,next=None): #传入值和指针self.data = data #值self.next = next #指向下一个结点的指针class LinkedList:def __init__(self):self.head = None #初始化头结点为Nonedef print(self):if self.head is None: #链表为空print("Linked list is empty")return itr = self.head #如果链表不空,itr指向头指针llstr = '' #初始化链表llstrwhile itr:llstr += str(itr.data) + '-->' #拼接链表操作itr = itr.next #指针后移print(llstr) #遍历完链表后,打印 def get_length(self):count = 0 itr = self.head #itr指向头指针while itr:count += 1 #计数itr = itr.next #指针后移return count #打印链表长度def insert_at_begining(self,data):node = Node(data, self.head) #实例化一个待插入的结点,该结点的指针指向头结点self.head = node #把实例化的新结点插在头结点上def insert_at_end(self,data):if self.head is None: #当链表为空时,把实例化的结点做为头结点,注意此时结点也是为尾结点,故指针为Noneself.head = Node(data,None)return itr = self.head #如果链表不为空,itr指向头指针while itr.next: #依次遍历,直到当前链表的尾结点itr = itr.nextitr.next = Node(data,None) #实例化一个结点插到链表尾部,注意此时结点是尾结点,故指针为Nonedef insert_at(self, index, data):if index < 0 or index > self.get_length(): #插入位置越界raise Exception("Invalid Index")if index == 0: #相当于在第一个位置插入结点self.insert_at_begining(data)returncount = 0itr = self.headwhile itr:if count == index-1: #在index前(即index-1处)插入结点node = Node(data, itr.next) #实例化一个新的结点,新的结点的指针指向当前itr的下一个结点itr.next = node #在当前itr后插入实例化的结点breakitr = itr.next count += 1def remove_at(self, index):if index<0 or index>=self.get_length(): #删除位置越界raise Exception("Invalid Index")if index == 0: #删除链表第一个结点self.head = self.head.next #只需把把头结点的指针往后移动一个即可returncount = 0itr = self.head while itr:if count == index-1: #找到待删除结点的上一个结点itr.next = itr.next.next #itr的指针指向它的下下个结点breakitr = itr.nextcount += 1def insert_values(self, data_list):self.head = Nonefor data in data_list: #依次插入data_list的每个元素 self.insert_at_end(data) #调用在尾部插入函数insert_at_enddef insert_after_value(self, data_after, data_to_insert):if self.head is None:return if self.head.data == data_after:self.head.next = Node(data_to_insert,self.head.next)return itr = self.headwhile itr:if itr.data == data_after:itr.next = Node(data_to_insert,itr.next)breakitr = itr.nextdef remove_by_value(self, data):if self.head is None:returnif self.head.data == data:self.head = self.head.nextreturn itr = self.headwhile itr.next:if it.next.data == data:itr.next = itr.next.nextbreakitr = itr.next#实例一
ll = LinkedList() #实例化链表类
ll.insert_values(['banana','mango','grapes','orange']) #插入一堆元素
ll.insert_at(1,"blueberry") #某一位置插入一个元素
ll.print() #打印当前链表
ll.remove_at(2) #删除某一位置元素
ll.print() #打印当前链表#实例二
ll_2 = LinkedList() #实例化链表类ll_2
ll_2.insert_values([45,7,12,567,99]) #插入一堆数值型元素
ll_2.insert_at_end(67) #在尾部插入一个元素
ll_2.print() #打印当前链表
实例一结果:
实例二结果:
Python数据结构实战——单向链表(LinkedList)相关推荐
- Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除(CRUD)
Java版数据结构之单向链表 CRUD Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除; 留了一个疑问; 我的代码仓库:https://github.com/zhuangbinan ...
- Java版数据结构之单向链表
Java版数据结构之单向链表 我的代码仓库:https://github.com/zhuangbinan/datastructure package club.zhuangbinan.linkedli ...
- Python数据结构 四种链表的集合
python数据结构四个链表的集合 结点的创建 import os# 创建节点 class Node:def __init__(self, data):self.data = dataself.nex ...
- Python数据结构学习笔记——链表:无序链表和有序链表
目录 一.链表 二.无序链表 实现步骤分析 三.无序链表的Python实现代码 四.有序链表 实现步骤分析 五.有序链表的Python实现代码 结语 一.链表 链表中每一个元素都由为两部分构成:一是该 ...
- 数据结构 (二) ----- 单向链表双向链表
相关文章: <数据结构 (一) ----- 数据结构基本概念&基于数组实现线性表> <数据结构 (二) ----- 单向链表&双向链表> 文章目录 单链表 一. ...
- CodeSalt | Python数据结构的实现 — 链表
Python数据结构实现-链表 1. 简单介绍 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Point ...
- 算法与数据结构(part6)--单向链表
学习笔记,仅供参考,有错必纠 参考自:单链表头指针.头结点.头元结的辨析 文章目录 算法与数据结构–基于python 链表 为啥需要链表 什么是链表 单向链表 什么是单向链表 单列表的操作 节点的实现 ...
- python链表结构_CodeSalt | Python数据结构的实现 — 链表
Python数据结构实现-链表 1. 简单介绍 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Point ...
- python数据结构之单链表
今天终于把大学都没想明白的链表数据结构整明白了,也算小小的收获,挺好玩的.文后附链表操作示意图. 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. ...
最新文章
- Git -- 基本操作 之 版本回退
- 照抄不翻车:抗住千万流量的大型分布式系统架构设计
- 周长相等的正方形面积一定相等_习题创编——周长相等的长方形面积(20200108)...
- 160 - 40 DaNiEl-RJ.1
- 力扣题目——160. 相交链表
- 在Python中使用设置文件的最佳做法是什么? [关闭]
- list, tuple, dict, set的用法总结
- Tomcat服务器端口修改,tomcat服务器配置端口 tomcat端口号修改操作步骤
- 【STM32H7教程】第2章 STM32H7的开发环境搭建
- 手机不能打电话没有信号无服务器,手机信号故障排除方法
- markdown笔记1--设置字体、颜色、图片、背景色
- c++ 11 for循环
- MapGuide 添加临时点图层
- 周浩正:写给编辑人的信 从“紫牛”说起
- 青岛新媒体运营教程:教你玩转抖音企业号,6步玩转抖音蓝v号
- Basics Algorithms| 岭回归(Ridge regression)
- 好的网站好的论坛社区
- 解决CSS样式重复定义带来的冲突问题
- php购物车登录用cookie,php利用cookies实现购物车的方法
- Python 发邮件(500, b‘Error: bad syntax‘)
热门文章
- 【李宏毅2020 ML/DL】P43-44 More about Adversarial Attack | Images Audio
- iOS 手机摇一摇功能
- 用计算机弹雅俗共赏,聊聊雅俗共赏:钢琴、饺子和面
- 三个关于“契约精神”的故事(转)
- thinkphp框架环境部署
- 正宗PC Unix实验环境
- ubuntu10.04以及10.10安装配置tftp服务
- 关于Servlet报错:405 HTTP method GET is not supported by this URL问题解决方法
- 开机没有自检声,显示器无信号及各版本BIOS报警信号大全 转
- 图解XP局域网共享设置教程汇总A