python菜鸟中的菜鸟 2021-12-05 19:19 采纳率: 100%
浏览 93
已结题

python 解决 链表快排问题

问题遇到的现象和发生背景

要求:创建quick_sort 函数只含有self,node两个parameter
用户输入的代码样式:

img

问题相关代码

img

img

我的解答思路和尝试过的方法

i左边的数小于pivot,i和j之间的包括ij都大于pivot

我想要达到的结果

从小到大输出链表

  • 写回答

2条回答 默认 最新

  • 鸡蛋酱$ 2021-12-06 00:19
    关注
    
    class Node:
        # 定义节点前驱,数据,后继
        def __init__(self, before=None, data=None, after=None):
            self.before = before
            self.data = data
            self.after = after
    
    
    class LinkList:
        def __init__(self):
            # 前节点置空(不建议设置成None,因为前节点有一个指针域的)
            self.head = Node()
    
        # 清空链表
        def clear(self):
            self.head = Node()
    
        # 插入数据reverse=True时为从小到大排序,False为不排序
        def insert(self, data, reverse=False):
            p = self.head
            if p.data is None and p.after is None:
                p.after = Node(before=p, data=data)
                return None
            if reverse is True:
                self.sort(node=p.after, data=data)
            if reverse is False:
                self.create(node=p.after, data=data)
    
        # 从小到大递归插入
        def sort(self, node, data):
            while node.after is not None:
                if data <= node.data:
                    new_node = Node(before=node.before, data=data, after=node)
                    node.before.after = new_node
                    node.before = new_node
                    return None
                else:
                    node = node.after
            if data < node.data:
                new_node = Node(before=node.before, data=data, after=node)
                node.before.after = new_node
                node.before = new_node
                return None
            new_node = Node(before=node, data=data)
            node.after = new_node
            return None
    
        # 正常插入
        def create(self, node, data):
            while node.after is not None:
                node = node.after
            new_node = Node(before=node, data=data)
            node.after = new_node
    
        # 显示链表的数据
        def display(self):
            p = self.head.after
            print('[', end='')
            while p.after is not None or p.data is not None:
                print(p.data, end='')
                if p.after is None:
                    break
                p = p.after
                print(end=', ')
            print(']')
    
    
    if __name__ == '__main__':
        n = [4, 2, 3, 1, 6, 0, -1, 1, 5]
        my_list0 = LinkList()
        my_list1 = LinkList()
        for i in range(len(n)):
            my_list0.insert(data=n[i], reverse=False)
            my_list1.insert(data=n[i], reverse=True)
        print("原列表:", n)
        print("无序插入链表:", end='')
        my_list0.display()
        print("有序插入链表:", end='')
        my_list1.display()
    
    

    img

    这个就是简单的数据结构的链表的实现,我即兴写的是双向链表的,双向链表的比较容易理解,
    有很大的优化空间,时间复杂度和空间复杂度有点大,你可以修改一下,有用的话点一下采纳

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月9日
  • 已采纳回答 12月9日
  • 请采纳用户回复 12月8日
  • 赞助了问题酬金 12月5日
  • 展开全部

悬赏问题

  • ¥15 如何解决蓝牙通话音频突发失真问题
  • ¥15 安装opengauss数据库报错
  • ¥15 【急】在线问答CNC雕刻机的电子电路与编程
  • ¥60 在mc68335芯片上移植ucos ii 的成功工程文件
  • ¥15 笔记本外接显示器正常,但是笔记本屏幕黑屏
  • ¥15 Python pandas
  • ¥15 蓝牙硬件,可以用哪几种方法控制手机点击和滑动
  • ¥15 生物医学数据分析。基础课程就v经常唱课程舅成牛逼
  • ¥15 云环境云开发云函数对接微信商户中的分账功能
  • ¥15 空间转录组CRAD遇到问题