- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python实现单向链表详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文研究的主要是Python中实现单向链表的相关内容,具体如下.
什么是链表 。
链表顾名思义就是~链 。
链表是一种动态数据结构,他的特点是用一组任意的存储单元存放数据元素。链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的。跟数组不同链表不用预先定义大小,而且硬件支持的话可以无限扩展.
链表与数组的不同点:
数组需要预先定义大小,无法适应数据动态地增减,数据小于定义的长度会浪费内存,数据超过预定义的长度无法插入。而链表是动态增删数据,可以随意增加.
数组适用于获取元素的操作,直接get索引即可,链表对于获取元素比较麻烦需要从头一直寻找,但是适用与增删,直接修改节点的指向即可,但是对于数组就比较麻烦了,例如[1,2,3,4]需要在下标为1的位置插入-2,则需要将[2,3,4]后移,赋值ls[1]=-2 。
数组从栈中分配空间, 对于程序员方便快速,但自由度小。链表从堆中分配空间, 自由度大但申请管理比较麻烦. 。
链表基本方法实现(Python) 。
1. 初始化链表 。
1
2
3
4
5
6
7
8
9
10
11
|
"""节点类"""
class
Node(
object
):
def
__init__(
self
, data):
self
.data
=
data
self
.nex
=
None
def
__init__(
self
):
"""初始化链表"""
self
.head
=
None
|
2. 获取链表长度 。
1
2
3
4
5
6
7
|
def
__len__(
self
):
pre
=
self
.head
length
=
0
while
pre:
length
+
=
1
pre
=
pre.nex
return
length
|
3. 追加节点 。
追加节点还是比较简单的,如果head节点不存在,则当前节点为head节点,否则的话找到尾节点,将尾节点的next指向当前节点(可以添加head和tail两个节点,就不用递归寻找尾节点了) 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
"""追加节点"""
def
append(
self
, data):
"""
1.head 为none :head-->node
2.tail.nex-->node
:param data:
:return:
"""
node
=
Node(data)
if
self
.head
is
None
:
self
.head
=
node
else
:
pre
=
self
.head
while
pre.nex:
pre
=
pre.nex
pre.nex
=
node
|
4. 获取节点 。
获取节点也是比较容易的,无非就是判断index值的正负 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
def
get(
self
, index):
"""
:param index:
:return:
"""
index
=
index
if
index >
=
0
else
len
(
self
)
+
index
if
len
(
self
) < index
or
index <
0
:
return
None
pre
=
self
.head
while
index:
pre
=
pre.nex
index
-
=
1
return
pre
|
5. 设置节点 。
找到当前节点赋值即可 。
1
2
3
4
5
6
7
|
"""设置节点"""
def
set
(
self
, index, data):
node
=
self
.get(index)
if
node:
node.data
=
data
return
node
|
6. 插入节点 。
插入节点需要找到插入节点的前一个节点pre_node(索引index的正负,前一节点不同,需要判断一下),然后将pre_node.nex指向当前节点。同时将当前节点的nex指向pre_node.nex.nex 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
"""插入节点"""
def
insert(
self
, index, data):
"""
1.index 插入节点位置包括正负数
2.找到index-1-->pre_node的节点
3.pre_node.next-->node
node.next-->pre_node.next.next
4.head
:param index:
:param data:
:return:
"""
node
=
Node(data)
if
abs
(index
+
1
) >
len
(
self
):
return
False
index
=
index
if
index >
=
0
else
len
(
self
)
+
index
+
1
if
index
=
=
0
:
node.nex
=
self
.head
self
.head
=
node
else
:
pre
=
self
.get(index
-
1
)
if
pre:
nex
=
pre.nex
pre.nex
=
node
node.nex
=
nex
else
:
return
False
return
node
|
7. 删除节点 。
删除节点,也要区分一下索引的正负。找到当前节点的前一个节点pre_node和后一个节点next_node,将pre_node.nex–>next_node即可 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
"""删除某个元素"""
def
delete(
self
, index):
f
=
index
if
index >
0
else
abs
(index
+
1
)
if
len
(
self
) <
=
f:
return
False
pre
=
self
.head
index
=
index
if
index >
=
0
else
len
(
self
)
+
index
prep
=
None
while
index:
prep
=
pre
pre
=
pre.nex
index
-
=
1
if
not
prep:
self
.head
=
pre.nex
else
:
prep.nex
=
pre.nex
return
pre.data
|
8. 反转链表 。
反转链表的实现有多种方式,比较简单的就是生成一个新的链表--》可以用数组存储所有节点让后倒序生成新的链表 在这里用下面这种方式生产: 反转链表就是将node.nex–>pre_node 递归实现即可,然后让tail赋值为head 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
"""反转链表"""
def
__reversed__(
self
):
"""
1.pre-->next 转变为 next-->pre
2.pre 若是head 则把 pre.nex --> None
3.tail-->self.head
:return:
"""
def
reverse(pre_node, node):
if
pre_node
is
self
.head:
pre_node.nex
=
None
if
node:
next_node
=
node.nex
node.nex
=
pre_node
return
reverse(node, next_node)
else
:
self
.head
=
pre_node
return
reverse(
self
.head,
self
.head.nex)
|
9. 清空链表 。
将头赋为空就好 。
1
2
3
4
|
"""清空链表"""
def
clear(
self
):
self
.head
=
None
|
总结 。
以上就是本文关于python实现单向链表详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持! 。
原文链接:http://blog.csdn.net/qq490691606/article/details/49945287 。
最后此篇关于python实现单向链表详解的文章就讲到这里了,如果你想了解更多关于python实现单向链表详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
前言:笔记是参考B站up主尚硅谷,图片、代码都是哦。在blog写笔记~(图片、代码来源尚硅谷,侵权必删!) 尚硅谷数据结构学习路线B站网站:https://www.bilibili.com/video
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我想创建一个没有全局变量的单个链表。我用 NULL 初始化了第一个元素,然后想将第一个元素 node 复制到 list_。它被复制到函数中,但副作用不起作用。在我的主函数中,该值仍然是NULL。如果我
我正在尝试使链表与此处的链表相似: linked list in C 那就是在另一个结构中有“头”,我首先称它为“头”。但是我发现做那个改变。很难向 list_item 结构添加值。我已经尝试了一些东
我正在尝试理解链表的代码。我明白他们是如何工作的。我正在查看一些与动态内存和链表有关的代码,我在此处对其进行了简化: #include #include typedef struct nod
有人可以解释下面的代码吗?我是 C 的新手,正在努力弄清楚。为什么我们最后有 queueNodeT? typedef char queueElementT; typedef struct queueN
场景如下:- 我想反转单链表的方向,换句话说,反转后所有指针现在应该指向后.. 这个算法应该需要线性时间。 我想到的解决方案是使用另一个数据结构 A Stack.. 借助它可以轻松反转单向链表,所有指
在 python 中使用链表最简单的方法是什么?在 scheme 中,链表由 '(1 2 3 4 5) 定义。 Python 的列表 [1, 2, 3, 4, 5] 和元组 (1, 2, 3, 4,
本文首发公众号:小码A梦 一般数据主要存储的形式主要有两种,一种是数组,一种是链表。数组是用来存储固定大小的同类型元素,存储在内存中是 一片连续 的空间。而链表就不同于数组。链表
虽然之前有人问过关于链表与数组的问题,但答案大多归结为我们大多数人在某个时候可能已经学到的东西: 列表擅长插入和删除 数组擅长随机访问 现在像 Bjarne Stroustrup 这样受人尊敬的人有
位置 在堆中,碎片化(每个节点的 malloc) - 在几种不同的方式(缓慢分配,缓慢访问,内存碎片)方面效率低下 在堆中,在一个大块中 - 当需要重新分配 时,数据结构获得的所有灵活性都将丢失 在堆
我完成了泛型的学习,但并不容易。不过,我确实明白了。这是我的理解。我希望您纠正我的错误并回答几个问题:)。 public class LinkedList { //class definition }
我将如何创建一个链接列表来在 OCaml 中保存我的数据?我正在尝试制作一个单链表,但是我遇到了语法问题。我只想制作一个模块来简单地从链表中获取'a,插入'a或删除'a。 有人知道吗? 最佳答案 正如
我在使用这段代码时遇到了问题,我不确定我做错了什么 #include #include #include #include typedef struct flight_struct{
我正在创建一个函数来删除给定列表的最后一个节点(作为参数输入)。该函数本身非常简单,如下所示。 function popBack(list) { var current = list.head
我正在尝试开发一种方法,该方法将在链接列表中的当前节点之前插入传递给它的节点。它有3个条件。对于此实现,不能有任何头节点(仅对列表中第一个节点的引用),并且我无法添加更多变量。 如果列表为空,则将传递
使用 scala,我已将大约 100000 个节点添加到链表中。当我使用函数 length 时,例如 mylist.length。我收到“java.lang.StackOverflowError”错误
所以我正在学习处理链表。我将如何递归地添加节点内的项目。我可以通过执行 sum = h.item +h.next.item+h.next.next.item 添加它们,但这只有在我有小的链接列表时才有
所以我一直在努力理解链表的概念(一直在看一些示例代码,我在互联网上找到了这个。现在如果我能请别人确认我是否正确掌握了一些概念。我将绘制图表,说明我认为每个代码链接的作用。 #include #inc
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我是一名优秀的程序员,十分优秀!