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实现链表(一) -> 正文阅读

[数据结构与算法]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 徐一
4 李四
3 张三
2 刘二

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
1 徐一
2 刘二
3 张三
4 李四

没问题,接下来继续,显示一下头部元素

# 显示头部元素数据
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
1 徐一
3 张三
4 李四
再次添加node2
1 徐一
2 胡歌
3 张三
4 李四

Process finished with exit code 0
没有问题,结束

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 01:36:44  更:2022-09-04 01:39:34 
 
开发: 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/19 18:34:15-

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