返回主站|会员中心|保存桌面|手机浏览
普通会员

暖家家电快修部

热水器、燃气灶、洗衣机、空调、冰箱、电视

新闻分类
  • 暂无分类
站内搜索
 
友情链接
  • 暂无链接
首页 > 新闻中心 > python链表复制(python-033-实现栈-使用链表实现-提高时间复杂度)
新闻中心
python链表复制(python-033-实现栈-使用链表实现-提高时间复杂度)
发布时间:2026-06-11        浏览次数:0        返回列表

链表作为Python中常用的一种数据结构,广泛应用于各种场景。在实际开发过程中,有时需要复制一个链表来实现一些操作。本文将深入探讨Python中的链表复制技术,希望能帮助大家更好地理解并运用这项技术。

一、链表复制简介

1. 链表的定义

链表是一种非线性数据结构,由一系列元素组成,每个元素称为节点(Node)。每个节点包含两部分:数据和指向下一个节点的指针。

2. 链表的复制

链表复制是指创建一个与原链表结构相同的新链表,并复制原链表中的元素。复制后的链表与原链表相互独立,修改其中一个链表不会影响另一个。

二、Python中的链表复制方法

在Python中,实现链表复制的方法主要有以下几种:

1. 迭代法

```python

def copy_linked_list(head):

if head is None:

return None

new_head = Node(head.val)

current = head.next

new_current = new_head

while current:

new_node = Node(current.val)

new_current.next = new_node

new_current = new_node

current = current.next

return new_head

```

2. 递归法

```python

def copy_linked_list_recursive(head):

if head is None:

return None

new_head = Node(head.val)

new_head.next = copy_linked_list_recursive(head.next)

return new_head

```

3. 利用Python内置的深拷贝功能

```python

import copy

def copy_linked_list_builtin(head):

if head is None:

return None

new_list = copy.deepcopy(list_node(head))

return list_to_linked_list(new_list)

```

其中,`list_node`和`list_to_linked_list`为辅助函数,分别用于将链表转换为列表和将列表转换为链表。

三、链表复制的应用场景

1. 克隆链表

在某些场景下,需要对链表进行克隆操作,例如:

- 缓存数据结构:为了提高访问效率,可以将链表中的数据缓存到内存中,然后再复制到数据库中。

- 分布式系统:在分布式系统中,节点间需要共享链表数据,可以通过链表复制来实现。

2. 算法测试

在算法测试过程中,需要验证算法的正确性,而复制链表可以帮助我们在不破坏原始数据的情况下进行操作。

3. 深拷贝

在某些场景下,需要获取链表的深拷贝,以实现独立操作。

链表复制在Python编程中具有重要的应用价值。本文从链表复制的原理、方法和应用场景等方面进行了深入探讨。通过了解并掌握链表复制技术,有助于我们更好地进行编程实践。

以下表格展示了不同复制方法的比较:

方法时间复杂度空间复杂度适用场景
迭代法O(n)O(1)链表元素较少、空间允许的场景
递归法O(n)O(n)链表元素较少、栈空间足够的场景
利用深拷贝功能O(n)O(n)链表元素较多、需要获取深拷贝的场景

希望本文对大家有所帮助,祝大家在编程的道路上越走越远!

python-033-实现栈-使用链表实现-提高时间复杂度

栈在我们之前的文章中就说明过了,想了解的去看一下030即可。

之前我们实现的栈,算法时间复杂度在摊销的情况下,是O(1),其底层是python的列表,是一种动态数组,在内存中是一个固定长度的数组,是无法改变大小的,只有重新换一个更大的数组来装新的数据。虽然实现起来非常简单,但是并不够完美。

在我们最开始的几篇文章中,很详细的介绍了链表的各种使用方式。之前实现链表时,只声明了节点对象,但是我们在程序的使用中应该把链表作为一个整体,作为一个对象来使用,这样封装性更好。

今天就不写这个链表了,我们利用在栈类中定义一个嵌套类来做为链表的节点对象,因为创建节点的操作非常多,所以我们用 slots来声明节点的两个成员变量,来减少内存的使用,提高效率。

链表是一种可以随时改变的数据结构。我们可以随时改变他的结构。

实现如下:

这次实现的栈的每一个方法操作,其时间复杂度都为O(1),不需要摊销。这与用数组实现的栈形成了对比。

链表实现的更快,明天用链表实现队列。

Python是什么

也许最初设计Python这种语言的人并没有想到今天Python会在工业和科研上获得如此广泛的使用。著名的自由软件作者Eric Raymond在他的文章《如何成为一名黑客》中,将Python列为黑客应当学习的四种编程语言之一,并建议人们从Python开始学习编程。这的确是一个中肯的建议,对于那些从来没有学习过编程或者并非计算机专业的编程学习者而言,Python是最好的选择之一。Python第一次学习Python,我只用了不到二十分钟的时间,站在书店里把一本教初学编程的人学习Python的书翻了一遍。也是从那时起,我开始被这种神奇的语言吸引。 Python可以用来开发symbian上的东西。易用与速度的完美结合Python是一种用起来很方便的语言,很多初学Java的人都会被Java的CLASSPATH搞得晕头转向,花上半天的时间才搞明白原来是CLASSPATH搞错了自己的Hello World才没法运行。用Python就不会有这种问题,只要装上就能直接用。 Python是一种脚本语言,写好了就可以直接运行,省去了编译链接的麻烦,对于需要多动手实践的初学者而言,也就是少了出错的机会。而且Python还有一种交互的方式,如果是一段简单的小程序,连编辑器都可以省了,直接敲进去就能运行。Python是一种清晰的语言,用缩进来表示程序的嵌套关系可谓是一种创举,把过去软性的编程风格升级为硬性的语法规定。再不需要在不同的风格间选择、再不需要为不同的风格争执。与Perl不同,Python中没有各种隐晦的缩写,不需要去强记各种奇怪的符号的含义。Python写的程序很容易懂,这是不少人的共识。Python是一种面向对象的语言,但它的面向对象却不象C++那样强调概念,而是更注重实用。不是为了体现对概念的完整支持而把语言搞得很复杂,而是用最简单的方法让编程者能够享受到面向对象带来的好处,这正是Python能像Java、C那样吸引众多支持者的原因之一。 Python是一种功能丰富的语言,它拥有一个强大的基本类库和数量众多的第三方扩展,使得Python程序员无需去羡慕Java的JDK。Python为程序员提供了丰富的基本功能使得人们写程序时用不着一切最底层做起。说到这里,人们通常会用一种担心:脚本语言通常很慢。脚本语言从运行的速度讲的确会慢一些,但Python的速度却比人们想象得快很多。虽然Python是一种脚本语言,但实际上也可以对它进行编译,就象编译Java程序一样将Python程序编译为一种特殊的ByteCode,在程序运行时,执行的是ByteCode,省去了对程序文本的分析解释,速度自然提升很多。在用Java编程是,人们崇尚一种Pure Java的方式,除了虚拟机一切东西都用Java编写,无论是基本的数据结构还是图形界面,而Pure Java的SWING,却成为无数Java应用开发者的噩梦。Python崇尚的是实用,它的整体环境是用C来编写的,很多基本的功能和扩展的模块都是用C/C++来编写的,当执行这一部分代码时,它的速度就是C的速度。用Python编写的普通桌面程序,其启动运行速度与用C写的程序差别不大。除了这些,通过一些第三方软件包,用Python编写的源代码还可以以类似JIT的方式运行,而这可以大大提高Python代码的运行速度,针对不同类型的代码,会有2倍至100倍不等的速度提升。 Python是我见到过的语言中,在易用性和速度上结合的最完美的一个,通过丧失一点点经常可以忽略不计的运行速度从而获得更高的编程效率,这就是我选择Python的原因。把精力放在要解决的问题上选择一种合适的语言,才能让你把有限的精力放到最需要解决的问题上。不同的语言有不同的作用,C和汇编适合编写系统软件,如果用它们来编写企业应用,恐怕没几个人能得心应手。我以前就碰到一个用汇编写数据库程序的哥,虽然最基本的功能完成了,但要增加个报表预览什么的,他就没法应付了。聪明的程序员是用合适的工具去完成任务,想找一把万能钥匙是不太可能的。Python的自动的垃圾回收机制是高级的编程语言的一种基本特性,用拥有这一功能的语言编程,程序员们通常不用去关心内存泄漏的问题,而当我们用C/C++写程序时,这却是最重要的需要认真考虑却又很容易出错的问题之一。数据结构是程序构成的重要部分,链表、树、图这些在用C编程时需要仔细表达的问题在Python中简单了很多。在Python中,最基本的数据结构就是数组、序列和哈希表,用它们想要表达各种常见的数据结构是非常容易的。没了定义指针、分配内存的任务,编程变得有趣了。CORBA是一种高级的软件体系结构,它是语言无关平台无关的。C++、Java等语言都有CORBA绑定,但与它们相比,Python的CORBA绑定却容易很多,因为在程序员看来,一个CORBA的类和Python的类用起来以及实现起来并没有什么差别。没了复杂体系结构的困扰,用Python编写CORBA程序也变得容易了。好钢要用在刀刃上,要想用有限的时间完成尽量多的任务,就要把各种无关的问题抛弃,而Python恰恰提供了这种方法。跨平台又易扩展随着Linux的不断成熟,越来越多的人转到Linux平台上工作,软件的开发者自然就希望自己编写的软件可以在所有平台下运行。Java一次编写处处运行的口号使它成为跨平台的开发工具的典范,但其运行速度却不被人们看好。实际上,几乎所有的著名脚本语言都是跨平台的,Python也不例外。Python不仅支持各种Linux/Unix系统,还支持Windows,甚至在Palm上都可以运行Python的程序。一个程序想要跨平台工作,不仅仅需要语言本身能够做到在平台之间兼容,在图形化界面的时代,还需要有能跨平台工作的Widget。Python不仅支持老一些的TK,还支持新的GTK+、QT以及wxWidget,而这些Widgets都可以在多个平台上工作。通过它们,程序员就可以编写出漂亮的跨平台GUI程序。Python通常是运行在native代码与脚本代码之间,程序员可以用C/C++为Python编写各种各样的模块,这不仅可以让程序员以Python的方式使用系统的各种服务及用C/C++编写的优秀函数库和类库,还可以大幅度提高Python程序的速度。用C/C++编写Python的模块并不复杂,而且为了简化这一工作,人们还制作了不少工具用来协助这一工作。正是因为如此,现在各种常用的函数库和类库都有Python语言的绑定,用Python可以做到的越来越多了。万能钥匙?Python功能强大,但它却不是万能的。如果你要编写操作系统或驱动程序,很显然,Python是做不到的。要写软件,没有哪个工具是万能的,现在之所以有那么多的编程语言,就是因为不同的语言适合做不同的。选择适合自己的语言工具是最重要的。

《python基础》~ 1

很多网站上都有python教程,不一而足,本篇教程会结合我在实际开发过程中遇到的问题,出很多有意思的小tricks。我会把你当做python小白来看待,所以不要心急和担心,一步步的讨教一下python的招式。

python是一门动态语言,它可以在运行时声明和使用变量,同时它也是一种强类型的语言,这一点有别于PHP,python会提供强制类型转换的方法,与java类似,但是PHP的话编译器会自动识别你所运用的变量到底是哪种类型。

注意:‘123’可以通过int()来转化成123,但是别的非数字字符串就不可

同时python也是支持复数运算的一门语言,虚部由一个后缀"j"或者"J"来表示。带有非零实部的复数记为"real+imagj",或者通过 complex(real, img)函数创建。记得以前c++中最经典的一些题目就是重载+运算符,使其可以支持复数运算。来看几个例子:

假设复数为z,那么它的实部就为z.real虚部就为z.imag

注意

不能将复数转化成常用的变量类型。你可以用abs函数取模。

在shell交互模式下,最近一次的计算结果保存在变量_(下划线)中,这样就可以很方便的进行运算操作。

python里面有一个string的module,我们先从最基本的开始讲起。

想必你对转义字符并不陌生,在python中也保留了这一转义传统,加入你在字符后面打上\,说明接下来的字符串是\之前的逻辑后缀:

将得到

那么很明显,‘

’就是我们熟悉的换行,\是逻辑继续符号。具体的输出格式你需要根据自己的shell跑跑看。

如果我们创建一个“行”("raw")字符串,\ n序列就不会转为换行,源码中的反斜杠和换行符n都会做为字符串中的数据处理

你将得到:

但是:

如果你还是嫌太麻烦,那么就用三引号(""")来包裹字符串,这样的话两个三引号之间不需要进行行尾换行处理。

就像你想的那样,字符串可以相加可以乘以一个数字进行成倍的复制,更令人吃惊的时两个字符串的值可以自动的粘黏在一起:

但是这个功能仅仅针对字符串常量。

接下来要讲到的一个字符串的功能跟python中的数组有莫大的关联,其实这句话是废话,一般而言字符串也不过就是一个储存在内存中的字符数组,但是我这句话的本意是想表达,python的数组,更严格来讲是list,有一个很强大的功能,那就是切片。

初学者可能还无法领会切片使用的奥义,那么我们来举几个例子你就能体会为什么这个功能是很多人选择python的理由。

所以现在你回头看看你以前熟悉的那些硬语言,没有哪一种是可以像这样操作数组或者列表的,这样就给数据结构和算法提供的莫大的方便。链表的操作跟上述的操作道理是一样的。这里不赘述了。

在介绍python中的核心概念module之前,相比你们都尝试过import这个功能,没错,python的强大之处就在于它的第三方包,这些包在python简洁的基础之上又进行了整理,使得语法更加的简单明了,更加地人性化。这里我们以string这个module为例子,介绍一下有关module的使用,希望大家可以举一反三。

无论对于哪一种语言来讲,字符串的操作是重中之重,为此大部分语言都将其作为一个单独的类或者包列出来,提供对字符串操作的方法。python也不例外。

首先打开你的终端(linux用户,windows就cmd吧),分别输入以下命令:

1 python

2 import stirng

3 dir(string)

会出现以下一大坨:

这些就是string这个module里面所包含的默认属性以及方法(属于类以级别,可按照java中的类方法理解),那些奇奇怪怪的下划线看不懂不要紧,下一篇文章我会解释。如果想知道其中某个函数比如find的用法,请在终端这么做: help(string.find),那么就会出现:

它会给你一个抽象方法和一个具体方法,如上,星号看不懂也没有关系,下章会讲,仅仅先当做参数。

那么string中常见的几个函数用法给大家列一下,具体情况具体help

高度预警:

函数'atoi'可以把string类型变量转化为int类型变量,但是仅限于转数字字符串类型

那么第一章就以string module结尾。

未完待续,求打脸,求评论,求口水。