| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> python实现链表(一) -> 正文阅读 |
|
[数据结构与算法]python实现链表(一) |
单链表,是一种链式存储的数据结构,每个数据中除了有保存的元素本身的数据,还有一个指针,这个指针指向链表里的下一个元素。 class nodes: # 初始化链表时,传入参数,这里第一个参数是链表的值,也可以说是保存的数据,可以是一个,也可以是多个 def __init__(self, node_no: int, node_name): # 下一个节点 self.next = None self.node_no = node_no self.node_name = node_name 这里每个节点有三个数据,一个是指针,一个是节点编号和节点姓名。 # 单向链表的实现,管理链表里的元素 class single_linked_list: # 初始化一个头节点,传入的索引为空 __head = nodes(0, '') 这里的单向链表有一个头结点,这个头结点是用来指向下一个节点的,本身不保存任何信息。 接下来,添加节点,我这里实现了两种添加方式,一种是无序添加,一种是按照node_no的大小添加。 无序添加节点 # 首先,找到最后一个节点 # 第二,将最后一个节点的索引指向新的节点 # 无序添加元素 def add(self, node: nodes): head = self.__head while True: # 如果链表索引为空,则退出循环 if head.next == None: break head = head.next # 为链表尾部的索引赋值 head.next = node 有序添加节点 # 根据第一个参数的大小来添加元素 def add_by_order(self, node: nodes): temp = self.__head # 判断添加的节点是否存在 flag = False while True: if temp.next == None: break # 找到位置,在temp的后端插入 if temp.next.node_no > node.node_no: break elif temp.next.node_no == node.node_no: flag = True # 说明编号存在 break temp = temp.next if flag: print('编号已经存在:' + str(temp.next.node_no)) else: # 先将传入的node里的索引指向temp.next,然后将temp.next里的索引指向node node.next = temp.next temp.next = node 那么,添加元素就结束了,测试一下,写一个展示链表所有元素的方法 # 显示链表,遍历一次 def show_list(self): if self.__head.next == None: print('链表为空。。。') return temp = self.__head.next while True: # 判断链表是否到尾部 if temp == None: break print(temp.node_no, temp.node_name) temp = temp.next node1 = nodes(1, '徐一') node2 = nodes(2, '刘二') node3 = nodes(3, '张三') node4 = nodes(4, '李四') 无序添加元素 #不按顺序添加 linklist.add(node1) linklist.add(node4) linklist.add(node3) linklist.add(node2) linklist.show_list() 输出 1 徐一 Process finished with exit code 0 再测试一下按no添加 linklist.add_by_order(node1) linklist.add_by_order(node4) linklist.add_by_order(node3) linklist.add_by_order(node2) linklist.add_by_order(node2) linklist.show_list() 编号已经存在:2 没问题,接下来继续,显示一下头部元素 # 显示头部元素数据 def show_head(self): if self.__head.next == None: print('链表为空。。。') # 注意,头结点是没有数据的,仅用来指向链表里的第一个元素 print(self.__head.next.node_no, self.__head.next.node_name) 修改和删除元素也要加上 # 修改链表元素 def update_node(self, node_no: int, node_name): temp = self.__head flag = False if temp.next == None: print('链表为空') return while True: if temp.next == None: break elif temp.node_no == node_no: flag = True break temp = temp.next if flag: temp.node_name = node_name else: print('没有找到此编号的人物') # 根据编号删除节点操作 def remove_node(self, node_no: int): temp = self.__head flag = False if temp.next == None: print('链表为空') return while True: if temp.next == None: break # 查找下一个节点是否和传入的节点相同 elif temp.next.node_no == node_no: flag = True break temp = temp.next if flag: # 将后面的数据删除 temp.next = temp.next.next else: print('没有找到节点') 测试 # 修改编号2姓名为胡歌 linklist.update_node(2, '胡歌') linklist.update_node(5,'一眼丁真') linklist.show_list() # 删除node2 print('删除node2') linklist.remove_node(2) linklist.show_list() print(linklist.link_length()) print('再次添加node2') linklist.add_by_order(node2) linklist.show_list() print(linklist.link_length()) 输出 删除node2 Process finished with exit code 0 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年11日历 | -2024/11/25 21:38:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |