带头结点的单链表

单链表数据结构实现

写在前面: 我是「虐猫人薛定谔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.youkuaiyun.com/Deep___Learning

### 带头结点单链表的数据结构实现方式 带头结点单链表是指在链表的第一个实际数据节点之前附加一个特殊的节点,称为头节点。这种设计使得对于链表的操作更加统一和简化[^1]。 #### 头节点的作用 - **简化操作**:由于存在固定的头节点,在进行插入或删除操作时不需要特殊处理第一个元素的情况。 - **方便管理**:可以通过固定不变的头指针访问整个列表,而无需担心首元节点的变化影响到程序逻辑。 - **增强灵活性**:允许空表和其他非空表具有相同的表示形式,从而减少了边界条件下的复杂度。 #### 单链表节点定义 为了创建带头结点单链表,通常会先定义一个代表链表中各个元素(即节点)的结构体: ```c++ struct ListNode { int val; // 节点存储的具体数值 ListNode* next;// 指向下一个节点的指针 // 构造函数初始化成员变量 explicit ListNode(int x = 0, ListNode *n = nullptr):val(x),next(n){} }; ``` 上述代码片段展示了如何利用C++中的`struct`关键字来构建带有默认参数构造器的一个简单版本的链表节点类[^2]。 #### 初始化带头结点单链表 当实例化这样一个链表对象时,默认情况下应分配并设置好这个额外增加进去作为占位符使用的头部节点: ```cpp class SinglyLinkedListWithHeaderNode{ private: ListNode* head_; //指向链表开头(实际上是虚拟头) public: SinglyLinkedListWithHeaderNode():head_(new ListNode()){} ~SinglyLinkedListWithHeaderNode(){ clear(); delete head_; } void addAtTail(int value){ auto newNode=new ListNode(value); if (!this->isEmpty()){ getLastNode()->next=newNode; }else{ this->head_->next=newNode; } } bool isEmpty() const{return this->head_->next==nullptr;} ListNode* getLastNode()const{//辅助函数用于获取最后一个有效节点 auto current=this->head_; while(current && current->next!=nullptr){ current=current->next; } return current; } void printListElements()const{ for(auto p=this->head_->next;p!=nullptr;p=p->next){ std::cout<<p->val<<" "; } std::cout<<"\n"; } void clear(){//释放除头外所有内存空间 ListNode* temp=nullptr; while(this->head_->next!=nullptr){ temp=this->head_->next; this->head_->next=temp->next; delete temp; } } }; ``` 这段代码实现了基本功能如添加新项至尾部(`addAtTail`)、判断是否为空(`isEmpty`)以及打印当前列表内容(`printListElements`)等功能,并且提供了析构函数以确保资源能够被适当回收[^4]。 #### 应用场景 带头结点单链表适用于多种情况,特别是在频繁执行增删操作的应用环境中表现出色。例如,在文件系统的路径解析过程中,每当遇到新的目录层级就需要动态地往现有路径后面追加相应的部分;又或者是某些缓存机制里需要高效维护最近最少使用(LRU)队列等场合下都可能采用此类结构来进行优化[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值