# 链表主要一个个结点构成,每个结点有两个关键元素分别为数值域和指针域,这里给出指针域的默认值为None #链表的基本操作包括:创建新表,删除表,判空,插入元素,删除元素,其中插入和删除表时候,分为两种 #情况:1.在表首插入和在一般位置插入元素 2.删除表头元素和删除一般位置元素 #另外还有一些基本的操作如:对表的遍历,定位(根据位置或值),求表的长度 #首先实现链表的插入:链表的插入不需要移动元素的位置,只需要改变链表的连接,创建一个新的结点然后将这个接入链表即可 class LNode: def __init__(self,elem,next_ =None): self.elem = elem self.next = next_ def insert0():#在表头前插入元素,该元素将成为新的表头元素,表头元素是一个链表存在的标志 head = LNode(0) #表头指针 a = LNode(3) #创建一个新结点 a.next = head #将原来链表连接在新结点的后面 head = a #新的结点作为表的头结点 #在单链表中的一般位置上插入元素,需要找到插入位置的前一个结点,现在假定找到了这个结点pre,插入的结点 #为p,赋值时应该从后往前赋值,保证链表不会断掉找不到。链表的查询顺序是从前往后的 def insert1():#一般情况下的插入 pre = LNode(2) q = LNode(4) q.next_ = pre.next pre.next = q def delete0():#删除表头元素,只需要修改表头指针将其指向表中的第二个结点即可,丢弃的结点会被Python自动回收 head = LNode(2) head = head.next #python具有自动存储管理机制,所以不需要考虑自己释放已经删除的结点的空间 def delete01():#删除一般位置的元素,删除一般位置的元素,也需要先找到该结点的前一个元素才行,将其前面一个元素和后面一个元素连接 pre = LNode(2) pre.next = pre.next.next #遍历链表,因为链表是单方向的表,其操作只能沿着一个方向进行,所有的操作都必须从表头元素开始 def travel0(): head = LNode(2) p = head #不直接使用表头结点,而是生成一个表头结点的拷贝 while p is not None: #循环查找的条件,只要结点存在,就往下找 p = p.next #这样p指针就一直沿着表的方向一直往下查找知道表尾 #查找链表中第i个结点,即按照位置进行查找 def travel1(): head = LNode(5) p = head i = int(input("please input the index of your number:")) while p and i > 0: #循环跳出时有两种情况,第一种情况是已经查询到了链表的尾部,这时候还没有发现第i 个结点,查找失败 p = p.next #另一种情况是没有查询到表尾的时候,就找到了目标的结点 if i == 0: print("找到了第i个结点的元素,即p指针的指向") if p == None: print("该表中不存在这个元素") #按照值进行查找 def travel(): head = LNode(0) p = head m = 6 while p and p.elem != m: p = p.next if p == None: print("该列表中不存在该元素") if p.elem == m: print("找到了这个值对应的列表元素,p的指向") def operation():#对表中的所有元素进行同一个操作 head = LNode(0) p = head while p: print(p.elem) p = p.next def find_length(): head = LNode(9) p = head #pyhton 可以在同一行中对多个变量同时进行赋值,以逗号作为分割符 n = 0 #正因为这样,所以在Python中交换两个变量的值,并不需要三行就可以完成,一句就可以了 while p: n += 1 p = p.next def create_list(): #思路是先创建一个头结点,然后不断在头结点的后面首先创建新的结点,并把新结点和前面的结点建立联系 head = LNode(0) p = head for i in range(10):#创建一个新结点连接在已有的表结点的后面 p.next = LNode(i) #创建新的结点,这里是以p作为起始的起点去创建后面的结点,这相当于不断的在给前面的 #的下一个结点创建新的结点,这一句就既创建了新的结点的结构,并且建立了与前面结点的联系 p = p.next #这里的p仍然充当是一个扫描指标的角色 def add_last():#在表的最后增加一个元素,首先需要先找到最后一个元素 head = LNode(0) #删除表的最后一个元素,表的最后一个元素和其他的元素之间的区间就是最后一个元素的next域的值是空的 p = head #最后一个元素后面没有再连接其他的元素 while p.next != None: p = p.next p.next = LNode(6) #给一个结点的后面增加一个新的结点,可以一句操作完毕 #不过这种根据前一种元素删除后面一种元素的方法时,需要检验表中至少要有两个以上的结点,分情况讨论 def delete_last():#删除表的最后一个元素,这样的话必须要找到表中的倒数第二元素,最后的元素的特点是#其next为None,倒数第二元素的next的next为空 head = LNode(0) p = head if p.next == None: e = p.elem head == None while p.next.next is not None: p = p.next e = p.elem p.next = None print("已经删除了最后一个元素,最后一个元素的值为:"+str(e))
Python实现链表结构及其相关操作
最新推荐文章于 2023-03-21 01:32:05 发布