带头结点的单链表

写在前面: 我是「虐猫人薛定谔i」,一个不满足于现状,有梦想,有追求的00后
\quad
本博客主要记录和分享自己毕生所学的知识,欢迎关注,第一时间获取更新。
\quad
不忘初心,方得始终。
\quad

❤❤❤❤❤❤❤❤❤❤

在这里插入图片描述

设计要求

设计一个带头结点的单链表,实现以下功能:

  1. isEmpty:判断链表是否为空
  2. getLength:返回表长
  3. getElem:返回指定位置处的元素
  4. locateElem:定位元素
  5. priorElem:返回元素e的前驱
  6. nextElem:返回元素e的后继
  7. listInsert:插入元素
  8. listDelete:删除元素
  9. listTraverse:实现链表的遍历操作

编写主函数进行测试

代码

"""
带头结点的单链表
"""
# 结点类
class Node:
    def __init__(self, data=None, Next=None):
        self.data = data
        self.next = Next

# 链表类
class LinkList:
    def __init__(self, length=0):
        self.length = length
        self.head = Node()
    
    def isEmpty(self):
        return self.length == 0
    
    def getLength(self):
        return self.length
    
    def getElem(self, pos):
        if pos < 1 or pos > self.length:
            return None
        else:
            p = self.head.next
            cnt = 1
            while p!= None:
                if pos == cnt:
                    return p.data
                p = p.next
                cnt += 1
            return None
    
    def locateElem(self, e):
        if self.length == 0:
            return -1
        else:
            p = self.head.next
            cnt = 1
            while p != None:
                if p.data == e:
                    return cnt
                p = p.next
                cnt += 1
            return -1
    
    def priorElem(self, e):
        if self.head.next.data == e:
            return False
        else:
            p = self.head
            while p.next != None:
                if p.next.data == e:
                    return p.data
                p = p.next
            return False

    def nextElem(self, e):
        p = self.head.next
        while p != None:
            if p.data == e:
                if p.next != None:
                    return p.next.data
                else:
                    return False
            p = p.next
        return False

    def listInsert(self, pos, e):
        if pos < 1 or pos > self.length + 1:
            return False
        else:
            if self.head.next == None:
                node = Node(e)
                self.head.next = node
                node.next = None
                self.length += 1
                return True
            else:
                p = self.head.next
                q = self.head
                cnt = 1
                while q != None:
                    if cnt == pos:
                        node = Node(e)
                        q.next = node
                        node.next = p
                        self.length += 1
                        return True
                    q = p
                    p = p.next
                    cnt += 1 
                return False
    
    def listDelete(self, pos):
        if pos < 1 or pos > self.length:
            return False
        else:
            p = self.head.next
            q = self.head
            cnt = 1
            while p != None:
                if cnt == pos:
                    q.next = p.next
                    self.length -= 1
                    return True
                q = p
                p = p.next
                cnt += 1
            return False

    def listTraverse(self):
        p = self.head.next
        flag = True
        while p != None:
            if flag:
                flag = False
                print(p.data, end=' ')
            else:
                print('->', p.data, end=' ')
            p = p.next
        print('')

# 测试
def main():
    linkList = LinkList()
    if linkList.isEmpty():
        print("---- 链表为空 ----")
    for i in range(10):
        linkList.listInsert(linkList.getLength()+1, i)
        print("第%d个位置的元素为:" % (i+1), linkList.getElem(i+1))
    linkList.listTraverse()
    if linkList.listInsert(1, 100):
        print("---- 插入成功 ----")
        linkList.listTraverse()
    else:
        print("---- 插入失败 ----")
    if linkList.listDelete(1):
        print("---- 删除成功 ----")
        linkList.listTraverse()
    else:
        print("---- 删除失败 ----")
    print("元素6的位置是:%d,其前驱元素是:%d,其后继元素是:%d" % (linkList.locateElem(6), linkList.priorElem(6), linkList.nextElem(6)))
    linkList.listInsert(3, 100)
    linkList.listTraverse()


if __name__ == "__main__":
    main()

测试

在这里插入图片描述

在这里插入图片描述

蒟蒻写博客不易,如果有误还请大佬们提出
如需转载,请署名作者并附上原文链接,蒟蒻非常感激
名称:虐猫人薛定谔i
博客地址:https://blog.csdn.net/Deep___Learning

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值