当前位置: 首页 > news >正文

python有序列表

您的代码整体结构良好,但存在一些关键错误和优化点。以下是对代码的详细评价及改进建议:---### 主要问题1. **add方法中的链表断裂问题**- **问题描述**:当向链表中间插入节点时,未正确设置新节点的`next`,导致后续节点丢失。- **错误代码**:```pythonprevious.next = temp# current = temp  # 这行是注释掉的,且未设置temp.next = current```- **修复建议**:插入节点后,应将新节点的`next`指向原`current`节点。```pythonprevious.next = temptemp.next = current  # 添加此行```2. **remove方法无法删除头节点**- **问题描述**:当删除头节点时,`previous`为`None`,直接访问`previous.next`会导致`AttributeError`。- **错误代码**:```pythonif current.data == data:previous.next = current.next  # 当previous为None时出错```- **修复建议**:需单独处理头节点的情况。```pythonif current.data == data:if previous is None:self.head = current.next  # 更新头节点else:previous.next = current.nextreturn```---### 其他优化建议1. **变量命名与注释**- 将`temp`改为`new_node`以提高可读性。- 在关键步骤添加注释,例如插入节点的逻辑。2. **异常类型选择**- 删除元素时若未找到数据,建议抛出`ValueError`而非`TypeError`,因为错误原因是值不存在而非类型问题。3. **简化Node类**- 如果不需要数据验证,可以省略`@property`和`@setter`,直接通过属性访问。---### 改进后的关键代码片段#### 修正后的`add`方法
```python
def add(self, data):new_node = Node(data)current = self.headprevious = Nonewhile current is not None and current.data <= new_node.data:previous = currentcurrent = current.nextif previous is None:new_node.next = self.headself.head = new_nodeelse:previous.next = new_nodenew_node.next = current  # 修复链表断裂
```#### 修正后的`remove`方法
```python
def remove(self, data):current = self.headprevious = Nonewhile current is not None:if current.data == data:if previous is None:self.head = current.next  # 处理头节点删除else:previous.next = current.nextreturnprevious = currentcurrent = current.nextraise ValueError(f"{data} not found in the ordered list")
```---### 测试建议
1. **插入中间节点**:验证链表是否完整。```pythonorderedlist = OrderedList()orderedlist.add(1)orderedlist.add(3)orderedlist.add(2)  # 应插入在1和3之间orderedlist.display()  # 预期输出:1 --> 2 --> 3 --> None```2. **删除头节点**:```pythonorderedlist.remove(1)orderedlist.display()  # 预期输出:2 --> 3 --> None```---通过修复这些问题,您的有序链表将能够正确处理所有插入和删除场景。总体代码逻辑清晰,继续加油!

class Node:"""链表的一个节点"""def __init__(self,data):self._data = dataself._next = None@propertydef data(self):return self._data@data.setterdef data(self,new_data):self._data = new_data@propertydef next(self):return self._next@next.setterdef next(self,next_node):self._next = next_nodeclass OrderedList:"""有序列表"""def __init__(self):self.head = Nonedef is_empty(self):return self.head is Nonedef add(self,data):temp = Node(data)current = self.headprevious = Nonewhile current is not None and current.data <= temp.data:previous = currentcurrent = current.nextif previous is None:temp.next = self.headself.head = tempreturnprevious.next = temp# current = tempdef search(self,data):current = self.headwhile current is not None :if current.data == data:return Truecurrent = current.nextreturn Falsedef remove(self,data):current = self.headprevious = Nonewhile current is not None:if current.data == data:previous.next = current.nextreturnprevious = currentcurrent = current.nextraise TypeError(f'{data} is not in the orderedlist')def size(self):count = 0current = self.head            while current is not None:count += 1current = current.nextreturn countdef display(self):current = self.headwhile current is not None:print(current.data,end=' --> ')current = current.nextprint('None') # 将节点接地orderedlist = OrderedList()
orderedlist.add(1)
orderedlist.add(2)
orderedlist.add(0)
orderedlist.add(-1)
orderedlist.display()
print(orderedlist.size())
print(orderedlist.search(2))
orderedlist.remove(1)
orderedlist.display()
print(orderedlist.size())评价一下我的代码

 修改好之后的代码:

class Node:"""链表的一个节点"""def __init__(self,data):self._data = dataself._next = None@propertydef data(self):return self._data@data.setterdef data(self,new_data):self._data = new_data@propertydef next(self):return self._next@next.setterdef next(self,next_node):self._next = next_nodeclass OrderedList:"""有序列表"""def __init__(self):self.head = Nonedef is_empty(self):return self.head is Nonedef add(self,data):temp = Node(data)current = self.headprevious = Nonewhile current is not None and current.data <= temp.data:previous = currentcurrent = current.nextif previous is None:temp.next = self.headself.head = tempreturnprevious.next = temptemp.next = current# current = tempdef search(self,data):current = self.headwhile current is not None :if current.data == data:return Truecurrent = current.nextreturn Falsedef remove(self,data):current = self.headprevious = None# 删除头节点if self.head is not None and self.head.data == data:self.head = self.head.nextreturnwhile current is not None:if current.data == data:previous.next = current.nextreturnprevious = currentcurrent = current.nextraise ValueError(f'{data} is not in the orderedlist')def size(self):count = 0current = self.head            while current is not None:count += 1current = current.nextreturn countdef display(self):current = self.headwhile current is not None:print(current.data,end=' --> ')current = current.nextprint('None') # 将节点接地orderedlist = OrderedList()
orderedlist.add(1)
orderedlist.add(2)
orderedlist.add(0)
orderedlist.add(-1)
orderedlist.display()
print(orderedlist.size())
print(orderedlist.search(2))
orderedlist.remove(-1) # 测试删除头节点
orderedlist.display()
print(orderedlist.size())
orderedlist.remove(2) # 测试删除另外一个边界点--尾节点
orderedlist.display()
print(orderedlist.size())输出:
-1 --> 0 --> 1 --> 2 --> None
4
True
0 --> 1 --> 2 --> None
3
0 --> 1 --> None
2

相关文章:

  • 【Triton 教程】triton_language.full
  • C++手撕STL-其一
  • 大语言模型的训练、微调及压缩技术
  • InternVL 3的技术深度分析,代码与原理
  • 【ELF2学习板】交叉编译FFTW
  • 记录学习的第二十九天
  • 浅析数据库面试问题
  • Langchain+chain+数据库操作
  • 守护者进程小练习
  • 2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(二级)答案 + 解析
  • 线上健身预约小程序源码介绍
  • C++ 20 信号量详解
  • 梯度下降,共轭梯度,牛顿法,拟牛顿法的收敛速度对比
  • SAP 查找JOB进程ID
  • 05、GPIO外设(五):CubeMX配置
  • SQL:聚合函数(Aggregate Functions)
  • Java 接入deepseek(非流式)
  • 基于autoware.1.14与gazebo联合仿真进行激光点云循迹仿真
  • 基于领域知识的A型主动脉夹层综合分割及面向临床的评估|文献速递-深度学习医疗AI最新文献
  • 【学习笔记】文件上传漏洞--黑白盒审计
  • 我国自主研制的重大航空装备AG600性能怎样?专家解读
  • 林诗栋4比1战胜梁靖崑,晋级世界杯男单决赛将和雨果争冠
  • 不断深化“数字上海”建设!上海市数据发展管理工作领导小组会议举行
  • 杭州:调整个人购买家庭住房享受契税优惠住房套数查询规则
  • 奥利弗·沙赫特博士:集群是产业集聚地,更是“超级连接器”
  • 沪市股票ETF规模已突破2万亿,宽基、债券、红利ETF受青睐