题解 | #从单向链表中删除指定值的节点#
从单向链表中删除指定值的节点
https://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f
一将输入节点进行筛选 只存储有效节点到map中 有如下三种情况 01 第一次添加节点(2 1);map存储 (2 1) 02 (2 3)节点冲突;map应存储(2 3) (3 1) 相当于删除(2 1)再添加(2 3)以及(3 1) 03 (1 3)不冲突; map存储(1 3) 二得到最终map后 因为有首节点 通过迭代可以拿到最终链表存储到list 三删除放弃节点 遍历输出 //建议手动画图 会很容易明白所谓冲突情况的处理 import java.util.Scanner; import java.util.*; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); String string = input.nextLine(); String[] stringarray = string.split(" "); int count = Integer.valueOf(stringarray[0]); String first = stringarray[1];//首节点 //放弃的节点 String giveup = stringarray[stringarray.length - 1]; //只存储真正有效的kv HashMap<String, String> hashMap = new HashMap<>(); //只遍历count-1次 ps:六个节点五个键值对 遍历五次就好 int n = count - 1; for (int i = 0, k = 2; i < n; i++) { //kv逆向匹配 //冲突情况 将原来的k v替换掉(相当于删除+添加) if (hashMap.containsKey(stringarray[k + 1])) { hashMap.put(stringarray[k], hashMap.get(stringarray[k +1])); hashMap.replace(stringarray[k+1], stringarray[k]); } else { //第一次加入 以及不冲突的情况 hashMap.put(stringarray[k+1], stringarray[k]); } k = k + 2; } List<String> list = new ArrayList<>(); list = alter(hashMap, first, list); list.remove(giveup);//删除放弃节点 for (String s : list) { System.out.print(s + " "); } } //k与v每次做翻转赋值给a 多次迭代 直到拿到最终链表 public static List<String> alter(HashMap<String, String> hashMap, String a, List<String> list) { if (list.size() == hashMap.size() + 1) { return list; } list.add(a); a = hashMap.get(a); return alter(hashMap, a, list); } }