如何根据用户输入的名称删除自定义LinkedList中的指定节点
自定义链表按值删除节点实现方案
疑问解答
- 你已经实现了
searchNode方法可根据节点存储的字符串值查找对应节点,仅需修正原有方法中字符串比较的逻辑即可正常使用 - 可以先查询节点索引再执行删除,但该方案需要两次遍历链表,效率更低,更推荐直接遍历找到待删除节点的前驱节点,一次遍历完成删除操作
代码修改说明
1. 修正原有节点搜索方法的字符串比较逻辑
你原有LinkedList类的searchNode方法使用==比较字符串,仅能比较字符串对象地址,无法匹配内容相同的不同字符串对象,修改为:
public ListNode searchNode(String data) { ListNode temp = this.head; while(temp != null) { // 改为equals匹配字符串内容 if(data.equals(temp.getData())) return temp; else temp = temp.link; } return null; }
2. 新增按值删除节点方法
在LinkedList类中添加如下方法:
public void deleteNodeByValue(String data) { // 空链表直接返回 if (head == null) { System.out.println("Error >> 链表为空,无节点可删除"); return; } // 待删除节点为头节点的情况 if (data.equals(head.getData())) { head = head.link; return; } // 遍历查找待删除节点的前驱节点 ListNode pre = head; ListNode current = head.link; while (current != null) { if (data.equals(current.getData())) { // 前驱节点直接指向待删除节点的后继,完成删除 pre.link = current.link; return; } pre = current; current = current.link; } // 未找到匹配节点 System.out.println("Error >> 未找到匹配的节点数据"); }
3. 修改main方法新增用户输入读取逻辑
首先在代码文件顶部导入输入工具类:
import java.util.Scanner;
修改C类的main方法末尾部分,添加输入读取和删除调用逻辑:
public static void main(String args[]) { // 原有代码保持不变 System.out.println("Delete last node."); L.deleteLastNode(); L.printList(); System.out.println("请输入您想要删除的目标数据 >> "); Scanner sc = new Scanner(System.in); String target = sc.nextLine().trim(); L.deleteNodeByValue(target); L.printList(); sc.close(); }
运行效果验证
修改后运行程序,输出完全符合要求:
Add three nodes. L = (mon, wed, sun) Add fri behind wed. L = (mon, wed, fri, sun) Delete last node. L = (mon, wed, fri) 请输入您想要删除的目标数据 >> wed L = (mon, fri)
内容的提问来源于stack exchange,提问作者RainyDay
相关产品推荐
相关产品推荐

