题解 | #从单向链表中删除指定值的节点#
直接手撸一个链表,借助一个map来统计已经创建过节点的值(题目说了,没有重复值)。但是,感觉题目有点问题。
题目输入的数据对建立的都是连续的链表。比如2->1,2->3,则有2->3->1,相当于新来的是一个插入操作,题目的从节点都是新创建的。但是,可能发生这种2->5,3->4,此时没有形成连续的链表,这时候新关系2->3,此时从节点3(还有其自己的从节点)是已经存在的,那么5和4怎么连接呢?我的代码中的下面这个语句块用于加载/创建从节点,将其替换为只创建的语句块,同样可以ac。
// 加载或者创建 if (map.containsKey(value1)) { node1 = map.get(value1); } else { node1 = new Node(value1); map.put(value1, node1); } // 只创建 node1 = new Node(value1); map.put(value1, node1);
下面是完整的代码:
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int nodeNum = sc.nextInt(); int headNodeValue = sc.nextInt(); int[] relation = new int[(nodeNum-1)*2]; int index = 0; for (int i = 1; i < nodeNum; i++) { relation[index++] = sc.nextInt(); relation[index++] = sc.nextInt(); } int delete = sc.nextInt(); Map<Integer, Node> map = new HashMap<>(); // 记录已经创建的节点(节点值不能重复) for (int i = 0; i < relation.length - 1; i+=2) { // 从节点 Node node1 = null; int value1 = relation[i]; if (map.containsKey(value1)) { node1 = map.get(value1); } else { node1 = new Node(value1); map.put(value1, node1); } // 主节点 Node node2 = null; int value2 = relation[i+1]; if (map.containsKey(value2)) { node2 = map.get(value2); Node succNode2 = node2.next; // node2原本的从节点 // Node succNode1 = node1.next; // node1原本的从节点(先不考虑,题目没说怎么处理) node2.next = node1; node1.next = succNode2; } else { node2 = new Node(value2, node1); // 新创建的node2无从节点 map.put(value2, node2); } } Node head = map.get(headNodeValue); map.clear(); while (head.next != null) { int value = head.value; if (value != delete) { System.out.print(value + " "); } head = head.next; } if (head.value != delete) { System.out.println(head.value); } } } class Node { int value; Node next; public Node(int value) { this.value = value; this.next = null; } public Node(int value, Node next) { this.value = value; this.next = next; } }