python链表相关操作

代码:


# 封装普通节点的类
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_empty(self):
        return self.size == 0
        # return self.head

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

    # 尾插
    def add_tail(self,value):
        node = Node(value)
        if self.is_empty():
            self.head = node
            self.size +=1
        else:
            q =  self.head
            while q.next:
                q = q.next
            q.next = node
            self.size += 1

    # 任意位置插入
    def add_index(self, index, value):
        node = Node(value)
        if index - 1 > self.size or index < 1:
            print("插入失败")
            return
        else:
            q = self.head
            if index == 1:
                self.add_head(value)
                return
            while index - 2:
                q = q.next
                index -= 1
            node.next = q.next
            q.next = node
            self.size += 1

    # 头删
    def del_head(self):
        if self.is_empty():
            return "链表为空"

        self.head = self.head.next
        self.size -= 1

    # 尾删
    def del_tail(self):
        if self.is_empty():
            return
        else:
            if self.size == 1:
                self.del_head()
                return
            q = self.head
            while q.next.next:
                q = q.next
            q.next = None
            self.size -= 1

    # 按任意位置删除
    def del_index(self,index):
        if self.is_empty():
            return
        if index - 1 >= self.size or index < 1:
            print("删除失败")
            return
        else:
            if self.size == 1 or index ==1:
                self.del_head()
                return
            q = self.head
            while index - 2:
                q = q.next
                index -= 1
            q.next = q.next.next
            self.size -= 1

    # 反转
    def reversal(self):
        if self.is_empty():
            return
        else:
            p = None
            q = self.head
            while q:
                next_node = q.next   # 暂存下一个节点
                q.next = p   # 当前节点指向前一个节点
                p = q   # 更新 prev 为当前节点
                q = next_node    # 移动到下一个节点
            self.head = p   # 返回新的头节点

    # 按位置修改
    def replace_index(self,index,value):
        node = Node(value)
        if index - 1 >= self.size  or index < 1:
            print("修改失败")
            return
        else:
            q = self.head
            if index == 1:
                node.next = self.head.next
                self.head = node
                return
            while index - 2:
                q = q.next
                index -= 1
            node.next = q.next.next
            q.next = node

    # 按值修改
    def replace_value(self,old_value,new_value):
        if self.is_empty():
            return
        else:
            q = self.head
            while q:
                if q.data == old_value:
                    q.data = new_value
                    break
                q = q.next
            else:
                print("未找到")

    # 按值查找返回的位置
    def find_value(self,value):
        if self.is_empty():
            return
        else:
            q = self.head
            for i in range(1,self.size+1):
                if q.data == value:
                    print(i)
                    break
                q = q.next
            else:
                print("未找到")

    # 遍历
    def show(self):
        if self.is_empty():
            print("链表为空")
        else:
            q = self.head
            while q:
                print(q.data,end=' ')
                q = q.next  #改变q的指向
            print()

if __name__ == '__main__':
    linkList = LinkList()
    # 头插
    linkList.add_head(10)
    linkList.add_head(20)
    linkList.add_head(30)
    linkList.add_head(40)
    linkList.add_head(50)
    # 尾插
    linkList.add_tail(60)
    linkList.show()
    # 任意位置插入
    linkList.add_index(1,99)
    linkList.show()
    # 头删
    linkList.del_head()
    linkList.del_head()
    linkList.show()
    # 尾删
    linkList.del_tail()
    linkList.show()
    # 任意位置删除
    linkList.del_index(1)
    linkList.show()
    # 反转
    linkList.reversal()
    linkList.show()
    # #按位置修改
    # linkList.replace_index(1,40)
    # linkList.show()
    # #按值修改
    # linkList.replace_value(30,20)
    # linkList.show()
    # # 按值查找返回的位置
    # linkList.find_value(40)

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值