Python实现链表结构及其相关操作

# 链表主要一个个结点构成,每个结点有两个关键元素分别为数值域和指针域,这里给出指针域的默认值为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))


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值