关于python3实现单向链表,以及链表反转的问题

单链表反转_python版 代码如下: class Node(object): def __init__(self, elem, next_=None): self.elem = elem self.next = next_ def reverseList(head): if head == None or head.next==None: # 若链表为空或者仅一个数就直... 阅读详情

起因:

最近看到了一个python3的笔试题目,说是实现一个单向链表,并实现反转方法。
说心里话,看到这样的题目,很无语。因为我觉得这应该是C语言做的事情,但是仔细一想,兴许这道题是为了考察面试者的算法能力呢?所以就自己实现了一下,顺便练习了一下pytest模块的使用。

talk is cheap,show me the code

#! /usr/bin/python3
# -*- coding:utf-8 -*-
# file: linklist.py
# author: wangchenxi
# mail: wongchenxi@icloud.com
# brief:
# version: 0.1.00
# Create Time:2019-11-12 17:03:51
# Last Update: 2019-11-13 00时14分52秒


class Node(object):

    def __init__(self, val=None, *args, **kwarg):
        self.value = val
        self.next = None


class LinkList(object):

    def __init__(self, *args, **kwarg):
        self.__head = None

    def __len__(self):
        size = 0
        t = self.__head
        while t:
            t = t.next
            size += 1
        return size

    def tolist(self):
        t = self.__head
        index = 0
        ret = []
        while t:
            ret.append(t.value)
            t = t.next
            index += 1
        return ret

    def fromlist(self, l):
        n = 0
        length = len(l)
        self.clear()
        while n < length:
            self.append(Node(l[n]))
            n += 1

    def travel(self):
        print(self.tolist())

    def push(self, n):
        if self.__head:
            n.next = self.__head
            self.__head = n
        else:
            self.__head = n

    def append(self, n):
        if not self.__head:
            self.__head = n
            return None
        index = 0
        np = self.__head
        while np:
            index += 1
            pre = np
            np = np.next
        pre.next = n

    def insert(self, pos, n):
        if not pos:
            return self.push(n)
        if pos > len(self)-1:
            return self.append(n)
        t = pos
        tn = self.__head
        fn = tn
        while t:
            fn = tn
            tn = tn.next
            t -= 1
        n.next = tn
        fn.next = n

    def pop(self, index=0):
        if index > len(self) - 1:
            return
        dn = self.__head
        fn = None
        while index:
            fn = dn
            dn = dn.next
            index -= 1
        else:
            if not fn:
                nn = self.__head.next
                self.__head.next = None
                ret = self.__head
                self.__head = nn
            else:
                nn = dn.next
                dn.next = None
                ret = dn
                fn.next = nn
        return ret

    def delete(self, index=0):
        self.pop(index)

    def clear(self):
        while len(self):
            self.delete()

    def update(self, pos, val):
        if pos > len(self) - 1:
            return
        sn = self.__head
        while pos:
            sn = sn.next
            pos -= 1
        else:
            sn.value = val

    def index(self, val):
        sn = self.__head
        ind = 0
        while sn and sn.value != val:
            ind += 1
            sn = sn.next
        if sn:
            return ind

    def reverse(self):
        _ = self.tolist()
        _ = _[-1::-1]
        self.fromlist(_)

    def myreverse(self):
        length = len(self)
        if length < 2:
            return
        ind = 0
        last = length - 1
        while ind < length:
            ret = self.pop(last)
            self.insert(ind, ret)
            ind += 1

pytest 模块测试

#! /usr/bin/python3
# -*- coding:utf-8 -*-
# file: test_linklist.py
# author: wangchenxi
# mail: wongchenxi@icloud.com
# brief:
# version: 0.1.00
# Create Time:2019-11-12 21:17:56
# Last Update: 2019-11-13 00时13分09秒
from linklist import Node, LinkList


def test_append():
    var_l = LinkList()
    r = list()
    for i in range(10):
        var_l.append(Node(i))
        r.append(i)
    assert var_l.tolist() == r


def test_insert():
    var_l = LinkList()
    r = list()
    for i in range(10):
        var_l.append(Node(i))
        r.append(i)
    var_l.insert(3, Node(20))
    r.insert(3, 20)
    assert var_l.tolist() == r


def test_delete():
    var_l = LinkList()
    r = list()
    for i in range(10):
        var_l.append(Node(i))
        r.append(i)
    var_l.delete()
    r.pop(0)
    assert var_l.tolist() == r


def test_delete1():
    var_l = LinkList()
    r = list()
    for i in range(10):
        var_l.append(Node(i))
        r.append(i)
    var_l.delete(3)
    r.pop(3)
    assert var_l.tolist() == r


def test_clear():
    var_l = LinkList()
    r = list()
    for i in range(10):
        var_l.append(Node(i))
        r.append(i)
    var_l.clear()
    r.clear()
    assert var_l.tolist() == r


def test_update():
    var_l = LinkList()
    r = list()
    for i in range(10):
        var_l.append(Node(i))
        r.append(i)
    var_l.update(4, 100)
    r[4] = 100
    assert var_l.tolist() == r


def test_index():
    var_l = LinkList()
    r = list()
    for i in range(10):
        var_l.append(Node(i))
        r.append(i)
    assert var_l.index(6) == r.index(6)


def test_reverse():
    var_l = LinkList()
    r = list()
    for i in range(10):
        var_l.append(Node(i))
        r.append(i)
    var_l.reverse()
    r = r[-1::-1]
    assert var_l.tolist() == r


def test_myreverse():
    var_l = LinkList()
    r = list()
    for i in range(10):
        var_l.append(Node(i))
        r.append(i)
    var_l.myreverse()
    r = r[-1::-1]
    assert var_l.tolist() == r

运行测试案例

pip3 install pytest
pytest -v test_linklist.py

测试案例执行结果

============================================================ test session starts ============================================================
platform linux -- Python 3.6.9, pytest-5.2.2, py-1.8.0, pluggy-0.13.0 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /home/wangchenxi/for_find_work/datastruct
plugins: pep8-1.0.6
collected 9 items                                                                                                                           

test_linklist.py::test_append PASSED                                                                                                  [ 11%]
test_linklist.py::test_insert PASSED                                                                                                  [ 22%]
test_linklist.py::test_delete PASSED                                                                                                  [ 33%]
test_linklist.py::test_delete1 PASSED                                                                                                 [ 44%]
test_linklist.py::test_clear PASSED                                                                                                   [ 55%]
test_linklist.py::test_update PASSED                                                                                                  [ 66%]
test_linklist.py::test_index PASSED                                                                                                   [ 77%]
test_linklist.py::test_reverse PASSED                                                                                                 [ 88%]
test_linklist.py::test_myreverse PASSED                                                                                               [100%]

============================================================= 9 passed in 0.05s =============================================================
【python链表】之单向链表详解 本文介绍内容:单链表的相关操作,包括增、删、查、改、链表的反转等 阅读详情

相关推荐

Python软体中如何实现一个单向链表的反转功能:详解与复杂度分析

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和一个指向下一个节点的引用(或指针)。在算法和数据结构的学习中,反转单向链表是一个经典问题,考察了程序员对链表操作的理解和实现能力。在上述代码中,我们定义了一个测试用例,通过向链表添加节点,并调用反转函数来验证链表反转的正确性。在上述代码中,我们通过循环遍历链表,并逐个反转节点的指针,最终返回反转后的链表头节点。在上述递归实现中,我们通过递归调用反转子链表,并调整当前节点的指针,使链表逐步反转。反转单向链表的基本思想是将每个节点的。

铭渊老黄 314

【Python数据结构】反转链表的方法

反转链表是指改变单链表中节点之间的连接关系,使得原本的正向顺序变为反向顺序。以下是反转单链表的常见方法:迭代法反转链表的流程:使用三个指针,通常命名为 prev、current 和 next:下面是具体的代码实现: 二. 递归法 设定递归函数,传入当前节点作为参数: 当前节点为空或只有一个节点时,直接返回该节点(此时无需反转); 否则,递归调用函数处理下一个节点,得到反转后的下一个节点; 然后修改当前节点的 next 指针,使之指向反转后返回的节点; 最后返回当前节点作为新的子链表的头节点。 请注

qq_42533357的博客 2801

Python3实现的反转单链表算法示例

本文实例讲述了Python3实现的反转单链表算法。分享给大家供大家参考,具体如下: 反转一个单链表。 方案一:迭代 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def reverseList(self, head): :type head: ListNode :rtype: ListNode cur,

206.反转链表 (Python3)

参考:206. 反转链表(双指针,清晰图解)

Tongcheng_98的博客 588

python如何实现单链表的反转

主要介绍了python如何实现单链表的反转,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

C#上位机与MES系统数据对接:从协议选型到安全传输的实战解析

本文详细解析了C#上位机与MES系统数据对接的全过程,从协议选型到安全传输的实战技巧。针对工业互联网场景下的数据对接挑战,提供了RESTful API、MQTT和OPC UA等协议的选型建议,并分享了健壮性设计、异常处理和安全传输的实用代码示例,帮助开发者高效实现数据上传与系统集成。

weixin_30566063的博客 105

Python数据结构3——链表

Python独特的语法特性,保存对象的地址。None是一个对象,而NULL是一个类型。与c++不同,Python中没有NULL,只有None,None有自己的特殊类型NoneType。None不等于0、任何空字符串、False等。在Python中,None、False、0、“”(空字符串)、、()(空元组)、{}(空字典)都相当于False。

qq_45942107的博客 1066

支付逻辑漏洞的八大姿势(上篇)

学习支付漏洞,看这篇文章!!!文章来源:SecHub网络安全社区(本资料仅供学习参考,严禁使用者进行未授权渗透测试!严禁任何形式的转载!

qq_39493066的博客 1358

反转链表python3(leetcode206、剑指offer24)

剑指 Offer 24. 反转链表 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 例子: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 限制:0 <= 节点个数 <= 5000 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): #

ziqingnian的博客 147

【多元统计分析】均值向量和协方差阵的检验——spss上机实验

均值向量和协方差阵的检验——spss上机实验 #参考书目为《多元统计分析》(第五版)——何晓群.中国人民大学出版社 #如有错误,请指正!谢谢~ #关注公众号搜索同名文章获取数据~ 习题2.3 现选取内蒙古、广西、贵州、云南、西藏、宁夏、新疆、甘肃和青海等9个内陆边远省区。选取人均GDP、第三产业比重、人均消费支出、人口自然增长率及文盲半文盲人口占15岁以上人口的比例等5项能较好的说明各地区社会经济发展水平的指标,验证边远及少数民族聚居区的社会经济发展水平与全国平均水平间有无显著差异。 将输入导入spss

suansuannainaizi的博客 3万+

实战演练,如何用Easyexcel合并单元格,设置字体、边框样式,并在尾行加入备注

,实现效果如下:1、多级表头合并2、表头底纹+表格边框3、合并相同数据单元格4、尾行加入备注。

Su7148的博客 1万+

(Python3)数据结构——05.单链表之链表反转的原理及实现

将一个链表反转,即反转后的第一个是原来的倒数第一个,第二个是原来的倒数第二个,以此类推。本文简单讲述了实现原理并用Python3实现。

1、、的博客 551

UVM环境复位--stop_sequences()

在UVM验证环境中, stop_sequences是一个用于强制终止所有正在运行的 Sequence 的方法,通常用于动态控制激励生成流程。1.通过uvm_config_db传递事件和严格的同步机制,此方案符适用于复杂复位场景和动态测试控制。组件耦合:Driver 和 Sequence 不再直接依赖env,通过标准接口通信。竞争条件:确保 Driver 完成清理后再终止 Sequence。代码健壮性:使用非阻塞操作和事件监听,避免死锁。

qq_42779035的博客 3014

基于Python实现单向链表的反转

循环方法 循环方法的思想是建立三个变量,分别指向当前结点,当前结点的前一个结点,新的head结点,从head开始,每次循环将相邻两个结点的方向反转。当整个链表循环遍历过一遍之后,链表的方向就被反转过来了。 class ListNode: def __init__(self, x): self.val = x self.next = None def...

Bryce_Liu的博客 1327

【Unity】【2D】用连续图片生成动画Animation的简明步骤

本文介绍了Unity中使用2D连续图片制作2D动画Animation的简明步骤。

O青草O的博客 Unity和游戏制作知识分享 718

Android 15.0 添加自定义服务,并生成jar给第三方app调用

在15.0系统ROM产品定制化开发中,由于需要新增加自定义的功能,所以要增加自定义服务,而app上层通过调用自定义服务,来调用相应的功能,所以系统需要先生成jar,然后生成jar 给上层app调用,接下来就来分析实现的步骤,然后来实现相关的功能 从而来实现所需要的功能

安卓兼职framework和app工程师的博客 667

Python 实现单向链表的插入、删除

插入节点 在单向链表中插入一个新节点有三种情况: 1.加到头结点之前 2.加到链表末尾 3.加到链表中间任意一个位置 solution1:.加到头结点之前 newnode.next=first first=newnode solution2:加到链表末尾 ptr.next=newnode newnode.next=None solution3:.加到链表中间任意一个位置 newnode.nex...

qq_43826983的博客 2118

从矩阵理论角度理解偏最小二乘回归,以及在脑科学中(脑影像与行为、基因表达的关系)的应用举例

偏最小二乘法 (PLS) 是一种多元数据驱动的统计技术,旨在提取表示最大大脑行为关联的潜在变量(或潜在成分 latent components [LC])。

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 975

Python实现反转链表

题目描述 将链表进行反转 Leetcode原题地址:https://leetcode-cn.com/problems/reverse-linked-list/ 测试用例 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 代码实现 其实代码的实现原理很简单,只需要按照下面几个步骤即可实现链表的反转: 保存上一个节点的节点信息 反转节点的指向,将当前节点的next指向上一个节点,比如原链表是:1-&g

修炼之路 8647

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Leetcode206 反转链表 C++,Java,Python 单向链表反转

Leetcode206 反转链表 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-linked-list 博主Github:https://github.com/GDUT-Rp/LeetCode 题目: 反转一个单链表 示例 1: 输入: 1->2->3->4->5->NULL 输出: 5-&g...

Rp的博客 356

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Python实现单向链表

单向链表每个节点都是由两部分组成:数据字段和指针,指针指向下一个元素在内存中的位置。 单向链表的第一个节点节点是链表头指针,而最后一个节点的指针设为None,不指向任何元素。(链表头指针相当重要!!!) 使用Python实现单向链表,我们可以使用一个节点类来封装节点,每创建一个节点就生成一个节点类的实例。 这里主要实现了单向链表节点的遍历、添加、插入、删除,反转。 代码如下: clas...

heibuliuqiu_gk的博客 269

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Python 实现单向链表

Python 实现单向链表 什么是 链表 链表顾名思义就是~链 链表是一种动态数据结构,他的特点是用一组任意的存储单元存放数据元素。链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的。跟数组不同链表不用预先定义大小,而且硬件支持的话可以无限扩展。

qq490691606的专栏 1万+

Python 实现反转、合并链表有啥用?

反转链表和合并链表是链表操作中的基础且重要的算法,在很多实际应用场景中都有广泛的用途,就如 V 哥文章开头介绍的应用场景,如果不懂应用场景来学链表反转、合并,即使掌握了实现原理,也只是学会了招式,而不懂为什么学。关注威哥爱编程,全栈开发就你行。

威哥爱编程,华为 HDE,鸿蒙极客、优快云博客专家、《鸿蒙 HarmonyOS 5/6 开发之路》系列图书第一作者 1509

python单向链表反转_python如何实现单链表的反转

python如何实现单链表的反转这篇文章主要介绍了python如何实现单链表的反转,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下代码如下# coding=utf-8class Node:def __init__(self, data=None, next=None):self.data = dataself.next = nextdef Rese...

weixin_39634579的博客 377

Python实现链表反转:迭代与递归双解法详解

本文详解链表反转的两种经典实现方法——迭代法和递归法,提供Python代码逐行解析,并对比两种方法的性能差异与应用场景。

2501_90618844的博客 1737

Python 实现单向链表,和单向链表的反转

链表中的每个节点会存储相邻节点的位置信息,单链表中的每个节点只存储下一关节点的位置信息。

Maisu的博客 80
上一篇: python manage.py makemigrations Nochangesdetected
Malloc_New
博客等级 码龄11年 0粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值