首页 文章详情

Python算法-创建单向链表

等风来也等你 | 55 2024-04-29 11:49 0 0 0
UniSMS (合一短信)

adcc6cdec63a832722596ed3b10bb0f7.webp




提到链表,会联想到链状的东西,如图1所示的黄金链。

611817c36c34e4d936aea0a7207494ef.webp

图1  黄金链

链的特点是一环扣一环,上一环的尾部扣着下一环的头部。链表也是如此,链表把上一环的尾部扣着下一环的头部的点称为结点,如图2所示的黄金链的位置。在编程语言中,链表是由一组结点的数据元素组成的数据结构。

72f4cc1aeb4edf85c6ff7da45bf06702.webp

图2  黄金链中的结点

了解结点后,接下来介绍链表的内部结构。链表的结构其实和图10.2所示内容类似,例如有“学生”这样一个链表,链表中需要包括学生的姓名、性别、学号等一些基本信息。创建这样的一个链表,链表里面包括多个学生的信息,链表的内部结构如图3所示。

bedc6a13dab7a6f35fdd081b9ee47e71.webp

图3  学生链表的内部结构图

从图3中可以看出,“学生一”的尾结点“next”指向了下一个“学生二”的头结点学号“02”,这就是链表的特性,即上一个信息的尾结点next会指向下一个信息的头结点的内存地址。由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就能够访问整个结点序列。 在上面讲解中出现了两个词:“指向”和“地址”,了解C语言的人可能会知道,这是典型的指针。没错,在C语言中,可以使用指针创建链表。但是在Python中并没有指针的概念,那么应该怎样创建链表呢?我们先来看如何使用Python交换两个值。首先是定义两个变量,代码如下: x=13 y=14 利用Python交换两个变量代码如下: x,y =y,x 在Python中交换值可以这样做,但在别的语言中不可以。这是因为在Python中,在定义x=13时,除了开辟一块内存给13这个值,还需要开辟一块内存用于存储13的地址,这块地址称之为x。类似地,在定义y=14时,除了开辟一块内存给14这个值,还需要开辟一块内存用于存储14的地址,这块称之为y。所以说,在Python中交换两个数的值,其实是地址的指向发生转换,类似于C语言中的指针。 在“x,y = y,x”中,我们先看右边,“y,x”的值分别为14,13。即得到“x,y =14,13”。然后x再存储14的地址,y再存储13的地址,这样就达到交换的效果。如图4所示。

b3c025560ca317bb6e06057882922069.webp

图4  交换值

因此,Python中的变量名保存的不是值,而是地址。同时,由于在Python中变量是隐式说明,所以Python中x可以指向任何东西。 了解地址在Python代码中的保存形式之后,就用Python代码实现利用结点创建一个链表的功能。代码如下:


                  
                    """
                  
                  
                    功能:定义类,作用是指向下一个结点
                  
                  
                    """
                  
                  
                    class Node():
                  
                  
                        def __init__(self,elem):        # 链表元素
                  
                  
                            self.elem =elem
                  
                  
                            self.next = None       # 初始设置下一结点为空
                  
                  
                    接下来,用代码实现利用结点创建一个学生链表。
                  
                  
                    实例1 创建学生链表                           
                  
                  
                    具体代码如下:
                  
                  
                    """
                  
                  
                    功能:创建学生结点类
                  
                  
                    """
                  
                  
                    class student:
                  
                  
                        def __init__(self):
                  
                  
                            self.name=''
                  
                  
                            self.sex = ''
                  
                  
                            self.next=None
                  
                  
                    
                      
head=student() # 建立链表头部 head.next=None # 下一个元素为空 ptr=head # 储存指针的位置 select=0 # 用来选择 while select!=2: # 不为2就循环 print("(1)添加 (2)退出程序") # 提示 select = int(input('请输入一个选项:')) if select==1: # 选择1时,添加信息 NewData=student() # 添加下一个元素 NewData.no = input("学号:") # 添加学号 NewData.name=input("姓名:") # 添加姓名 NewData.sex=input("性别:") # 添加性别 ptr.next=NewData # 存储指针设置为新元素所在的位置 NewData.next=None # 下一个元素的next先设置为空 ptr=ptr.next # 指向下一个结点 elif select == 2: # 选择2时退出程序 break else: # 选择其他时提示有误 print("输入有误")

运行结果如图5所示。

6a89fe95e1e9a9c8e033494848ccef33.webp

图5  创建学生链表








a78e2968c5ce7f0693d2125b41b36c0f.webp

good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter