如何修改Python链表排序代码以按人口数量从大到小排序?
链表排序修改方案:按人口数量从大到小排序
需要修改的核心部分
你的代码当前默认按元组的第一个元素(国家名称)A-Z排序,要改成按人口从大到小排序,只需修改**sortLinkedListHelper函数里的比较判断逻辑**:
- 原代码用
current.next.data < newNode.data比较整个元组,会优先对比国家名称 - 要改为专门比较元组的第二个元素(人口数量),并且为了实现降序,把比较符号反转,最终条件为
current.next.data[1] > newNode.data[1]
修改后的完整代码
# 创建链表节点类 class Node: def __init__(self, data=None, next=None): self.data = data self.next = next # 遍历并打印链表的函数 def printList(head): temp = head while temp: print(temp.data, end=" ") temp = temp.next # 辅助函数:将新节点插入到正确的排序位置 def sortLinkedListHelper(head, newNode): temp = Node() current = temp temp.next = head # 修改比较逻辑:按人口数量从大到小排序 while current.next and current.next.data[1] > newNode.data[1]: current = current.next newNode.next = current.next current.next = newNode return temp.next # 排序链表的主函数 def sortLinkedList(head): answerList = None current = head while current: nextNode = current.next answerList = sortLinkedListHelper(answerList, current) current = nextNode return answerList if __name__ == '__main__': # 链表数据:(国家名称, 人口数量) countries = [("Ukraine",41879904),("Brunei",442400),("Christmas Island (Australia)",1928),("Mauritius",1265985),("Lesotho",2007201),("Guatemala",16604026),("British Virgin Islands (UK)",30030),("Malta",493559)] head = None # 从后往前构建链表 for i in reversed(range(len(countries))): head = Node(countries[i], head) # 打印原链表 print("原链表: ") printList(head) # 排序链表 head = sortLinkedList(head) # 打印排序后的链表 print("\n\n按人口从大到小排序后的链表: ") printList(head)
逻辑说明
- Python中默认的元组比较是按元素顺序依次对比,比如
("A", 100) < ("B", 50)会返回True,因为优先对比第一个元素 - 改成
data[1]后,就专门针对元组里的人口数值进行对比 - 把
<替换成>,是为了让人口多的节点排在前面:当当前节点的人口比新节点大时,继续往后查找插入位置,直到找到人口比新节点小的位置,再插入新节点
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

