题解 | #从单向链表中删除指定值的节点#

从单向链表中删除指定值的节点

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);
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务