You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python单链表堆排序中数组拆分返回None数组问题排查

堆排序实现中的数组填充错误分析与修复

问题场景

自行实现list_node(链表节点)和linked_list(单链表)类,尝试将链表节点存入数组后拆分为每组2个元素的子数组以进行堆排序,但运行后数组全为None,期望输出格式为[[A,B],[C,D],[E]](其中A/B/C/D/E为对应链表节点对象)。

原代码及运行输出

import numpy as np
import math as mt

class list_node:
    def __init__(self,obj,next_listnode):
        self.obj = obj
        self.next_listnode  = next_listnode

class linked_list:
    def __init__(self,list_node):
        self.list_node =list_node

    def add_node(self,obj):
        current = self.list_node
        while current.next_listnode is not None:
            current = current.next_listnode
        current.next_listnode = obj;

    def print_linkedlist(self):
        current  = self.list_node
        while current:
            print("",current.obj)
            print("\n")
            current = current.next_listnode

    def delete_node(self,obj):
        current  = self.list_node
        if current.obj is  obj:
            target = current.next_listnode
            self.list_node = current.next_listnode
            del target
        else:
            while current.next_listnode.obj is not obj:
                current = current.next_listnode
            target = current.next_listnode
            current.next_listnode = current.next_listnode.next_listnode
            del target

    def heap_sort(self):
        x = 0
        current = self.list_node
        while current:
            current = current.next_listnode
            x=x+1
        print(x)

        arr = [None]*x
        x = 0
        while current:
            arr[x] = current
            current = current.next_listnode
            x = x+1
        newarr= np.array_split(arr,mt.ceil(len(arr)/2))
        print(newarr)


A = list_node("John",None)
B = list_node("Mike",None)
C = list_node("Han",None)
D = list_node("Daisy",None)
E = list_node("Piggy",None)

liste = linked_list(A)
liste.add_node(B)
liste.add_node(C)
liste.add_node(D)
liste.add_node(E)
liste.heap_sort()

运行输出:

5
[array([None, None], dtype=object), array([None, None], dtype=object), array([None], dtype=object)]

错误原因

在heap_sort方法中,第一个while循环用于统计链表长度,遍历结束后current已经指向链表末尾的None。第二个while循环直接以这个None作为起始判断条件,循环根本不会执行,导致arr始终是初始化的全None数组。

修复方案

统计完链表长度后,将current重新指向链表头节点self.list_node,再执行填充数组的循环。

修复后的heap_sort方法

def heap_sort(self):
    x = 0
    current = self.list_node
    while current:
        current = current.next_listnode
        x += 1
    print(x)

    arr = [None]*x
    x = 0
    # 重置current到链表头
    current = self.list_node
    while current:
        arr[x] = current  # 若需要展示节点的obj属性,可改为current.obj
        current = current.next_listnode
        x += 1
    newarr= np.array_split(arr,mt.ceil(len(arr)/2))
    print(newarr)

运行结果(存储节点对象的情况)

5
[array([<__main__.list_node object at 0x102345678>, <__main__.list_node object at 0x1023456a0>], dtype=object), array([<__main__.list_node object at 0x1023456c8>, <__main__.list_node object at 0x1023456f0>], dtype=object), array([<__main__.list_node object at 0x102345718>], dtype=object)]

如果需要直观展示节点的内容,将arr[x] = current改为arr[x] = current.obj,输出会显示节点存储的字符串值:

5
[array(['John', 'Mike'], dtype='<U5'), array(['Han', 'Daisy'], dtype='<U5'), array(['Piggy'], dtype='<U5')]

额外优化建议

可以合并统计长度和填充数组的步骤,一次遍历完成,减少时间开销:

def heap_sort(self):
    arr = []
    current = self.list_node
    while current:
        arr.append(current)  # 或current.obj
        current = current.next_listnode
    print(len(arr))
    newarr= np.array_split(arr,mt.ceil(len(arr)/2))
    print(newarr)

内容的提问来源于stack exchange,提问作者Volpina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:40:28