python数据结构篇:0基础带你入门python之链表

# 普通节点
from faulthandler import is_enabled


class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
# 头节点
class LinkList:
    def __init__(self, node= None):
        self.size = 0
        self.head = node

    def is_empty(self):
        return self.size == 0

    def show(self):
        if self.is_empty():
            print("空线性表,无需遍历")
            return False

        q = self.head
        while q:
            print(q.data,end=' ')
            q = q.next
        print()

    def add_head(self, value):
        node = Node(value)

        node.next = self.head
        self.head = node
        self.size += 1

    def add_end(self,value):
        node = Node(value)
        if self.is_empty():
            self.head = node
            self.size += 1
            return True

        q = self.head
        while q.next:
            q = q.next
        q.next = node
        self.size += 1

    def add_any(self, index, value):
        if index<=0 or index-1>self.size:
            print("超出索引,插入失败")
            return False

        node = Node(value)

        if index == 1:
            self.add_head(value)
            return True

        p = self.head
        p_num = 1
        while p_num < index-1:
            p = p.next
            p_num += 1
        node.next = p.next
        p.next = node
        self.size += 1
        return True

    # def del_data(self,value):
    #     if self.is_empty():
    #         print("空线性表,无需删除")
    #         return False
    #
    #     p_up = self.head
    #     p_new = self.head
    #     while

    def del_head(self):
        if self.is_empty():
            print("空线性表,不需要删除")
            return False

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

    def del_end(self):
        if self.is_empty():
            print("空线性表,不需要删除")
            return False

        if self.size == 1:
            self.del_head()
            return False

        p = self.head
        while p.next.next:
            p = p.next

        p.next = None
        self.size -= 1

    def del_any(self, index):
        if self.is_empty() or index <=0 or index > self.size:
            print("超出索引,无法删除")
            return False

        if index == 1:
            self.del_head()
            return False

        p = self.head
        p_num = 1
        while p_num < index-1:
            p = p.next
            p_num += 1

        p.next = p.next.next
        self.size -= 1

    def re_index(self, index, value):
        if self.is_empty():
            print("空链表,无法修改")
            return False

        if index > self.size or index <0:
            print("超出索引,修改错误")

        p = self.head
        i = 1
        while i < index:
            p = p.next
            i += 1
        p.data = value

    def re_value(self,value_old, value_new):
        if self.is_empty():
            print("空链表,无法修改")
            return False

        p = self.head
        while p:
            if p.data == value_old:
                p.data = value_new
            p = p.next

    def value_index(self, value):
        if self.is_empty():
            print("空链表,无法查找")
            return False

        p = self.head
        p_index = 1
        while p:
            if p.data == value:
                return p_index
            p = p.next
            p_index += 1

    def reverse(self):
        if self.is_empty():
            print("空链表,无法查找")
            return False

        # 反转值
        # p = self.head
        # n = self.size
        # while p:
        #     self.add_head(p.data)
        #     p = p.next
        # while n:
        #     self.del_end()
        #     n -= 1

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

if __name__ == '__main__':
    T = LinkList()

    # 头插
    T.add_head(10)
    T.add_head(20)
    T.add_head(30)
    T.show()

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

    # 尾插
    T.add_end(10)
    T.add_end(20)
    T.show()

    # 尾删
    T.del_end()
    T.del_end()
    T.show()

    # 任意插
    T.add_any(1, 40)
    T.show()

    # 任意删
    T.del_any(1)
    T.show()

    T.add_head(10)
    T.add_head(20)
    T.add_head(30)
    T.add_head(30)
    T.add_head(30)
    T.show()

    # 按位置修改
    T.re_index(2,100)
    T.show()

    # 按值修改
    T.re_value(30, 300)
    T.show()

    # 按值查找返回值
    t = T.value_index(20)
    print(t)

    # 反转
    T.reverse()
    T.show()




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值