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

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

http://www.xdnf.cn/news/141.html

相关文章:

  • Excel提取图片并自动上传到文件服务器(OOS),获取文件链接
  • Docker用model.config部署及更新多个模型
  • 【基础知识补充】标准库类型:string和vector
  • JDBC 与 MyBatis 详解:从基础到实践
  • 07_Docker 资源限制
  • 软件研发技术团队管理规范
  • 安卓手机如何改ip地址教程
  • ETL数据集成平台在交通运输行业的五大应用场景
  • 旅游资源网站登录(jsp+ssm+mysql5.x)
  • LeetCode 259 题全解析:Swift 快速找出“满足条件”的三人组
  • RocketMQ 的详细使用教程
  • 【多目标进化算法】NSGA-II 算法(结合例子)
  • 【C++】 —— 笔试刷题day_19
  • Web3架构下的数据隐私与保护
  • 【数据结构_10】二叉树(2)
  • HarmonyOS:1.4 - HarmonyOS应用程序框架基础
  • Python(21)Python日期时间完全指南:从基础到实战注意事项
  • QT 文件和文件夹操作
  • 基于SpringBoot成绩管理系统设计与实现(源码+文档+部署讲解)
  • SAP系统中MD01与MD02区别
  • 如何使用Python进行自动化的系统管理?
  • 《软件设计师》复习笔记(14.2)——统一建模语言UML、事务关系图
  • TCL 亮相北京 InfoComm China 2025,引领商显智能化变革浪潮
  • AI数据分析与BI可视化结合:解锁企业决策新境界
  • Java 高并发核心:线程池使用详解 + 自定义参数配置全剖析(附源码+面试解析)
  • 基于ubuntu24.10安装NACOS2.5.1的简介
  • PHP腾讯云人脸核身获取Access Token
  • 【ESP32-IDF笔记】06-触摸传感IO配置
  • day1-小白学习JAVA(mac版)---(jdk安装和环境变量配置)
  • 《软件设计师》复习笔记(14.3)——设计模式