单向链接表

# 封装普通节点的类
class Node:
    # 构造函数 定义节点的属性
    def __init__(self, data):
        self.data = data  #普通节点的数据域
        self.next =None  #普通节点的链接域  刚构造的节点该位置域为空

# 封装链表的类(封装头节点)
class LinkList:
    #构造函数
    def __init__(self, node=None):
        self.size = 0  #头结点的数据域位0 链表的长度为0
        self.head = node  #头节点的连接域指向None

    #判空
    def is_empy(self):
        return self.size == 0  #判断链表长度是否为0

    # 头插
    def add_head(self,value):
        #创建一个新的节点
        node = Node(value)
        #头插
        node.next = self.head
        self.head = node
        #插入成功 链表长度自增
        self.size += 1

    # 遍历
    def show(self):
        #判空
        if self.is_empy():
            print("空")
            return
        else:
            q = self.head
            while q:
                print("%d" % q.data, end=" ")
                q = q.next  #改变q的指向
            print()
    #尾插
    def add_tial(self,value):
        #可以判空 空的话  直接将head = node
        #创建一个节点
        node = Node(value)
        #找到链表的最后一个节点
        p = self.head
        i = 1
        while i < self.size:
            p = p.next
            i += 1
        #尾插
        p.next = node
        #尾插成功 链表长度自增
        self.size += 1

    # 任意位置插入数据
    def add_idex(self,idex,value):
        # 判断位置是否合理
        if idex<1 or idex > self.size:
            print("插入失败")
            return

        if idex == 1: #当插入的是第一个位置  头插
            self.add_head(value)
        else:
            # 找到要插入位置的前一个节点
            p = self.head
            i = 1
            while i < idex - 1:
                p = p.next
                i += 1
            #创建一个新的节点
            node = Node(value)
            # 插入
            node.next = p.next
            p.next = node
            # 插入成功 链表自增
            self.size += 1
    # 头删
    def del_head(self):
        # 判空
        if self.is_empy():
            print("删除失败")
        else:
            self.head = self.head.next
            # 删除成功 长度自减
            self.size -= 1
    # 尾删
    def del_tail(self):
        # 判空
        if self.is_empy():
            print("删除失败")
        elif self.size == 1:  # 当链表只有一个节点时
                self.head = None
        else:
            # 找到最后一个节点的前一个节点
            q = self.head
            i = 1
            while i < self.size - 1:
                q = q.next
                i += 1
            # 删除
            q.next = None
            # 删除成功 长度自减
            self.size -= 1
    # 任意位置删除
    def del_idex(self,idex):
        if idex<1 or idex > self.size:
            print("删除失败")
            return
        if idex == 1: #当删除的是第一个位置  头删
            self.del_head()
        else:
            # 找到要删除位置的前一个节点
            p = self.head
            i = 1
            while i < idex - 1:
                p = p.next
                i += 1
            # 删除
            q = p.next
            p.next = q.next
            q.next = None
            # 删除成功 链表自减
            self.size -= 1
    # 按位置修改
    def change_idex(self, idex, new_value):
        if idex<1 or idex > self.size:
            print("修改失败")
            return
        if idex == 1: #当插入的是第一个位置  头插
            self.del_head()
            self.add_head(new_value)
        else:
            p = self.head
            i = 1
            while i < idex:
                i += 1
            p.data = new_value
        print(f"节点位置 {idex} 的值已修改为 {new_value}")

    # 按值修改
    def change_value(self, old_value, new_value):
        p = self.head
        while p is not None:
            if p.data == old_value:
                p.data = new_value
                print(f"节点值 {old_value} 已修改为 {new_value}")
                return
            p = p.next
        print(f"修改失败:未找到值 {old_value}")

    # 按值查找返回位置
    def show_idex(self, value):
        p = self.head
        i = 1
        while p is not None:
            if p.data == value:
                print(f"值 {value} 位于链表的第 {i} 个位置")
                return i
            p = p.next
            i += 1
        print(f"值 {value} 不在链表中")
        return -1

    def reverse(self):
        a = None
        p = self.head
        while p is not None:
            next_node = p.next
            p.next = a
            a = p
            p = next_node
        self.head = a
        print("链表已反转")


# 测试
if __name__ == "__main__":
    # 创建链表
    linkList = LinkList()
    # 头插
    linkList.add_head(10)
    linkList.add_head(20)
    linkList.add_head(30)
    linkList.add_head(40)
    # 遍历
    linkList.show()

    # 尾插
    linkList.add_tial(11)

    # 遍历
    linkList.show()

    # 任意位置插入
    linkList.add_idex(3,107)
    linkList.show()

    # 头删
    linkList.del_head()
    linkList.show()

    # 尾删
    linkList.del_tail()
    linkList.show()

    #任意位置删除
    linkList.del_idex(2)
    linkList.show()

    #按位置修改
    linkList.change_idex(1,88)
    linkList.show()

    # 按值修改
    linkList.change_value(20,77)
    linkList.show()

    # 按照值查找返回位置
    linkList.show_idex(10)
    linkList.show()

    #链表的反转
    linkList.reverse()
    linkList.show()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值