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

直接手撸一个链表,借助一个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;
    }
}


全部评论

相关推荐

大方的大熊猫准备进厂:1.教育背景:你希望从事什么专业的工作你的主修课就是什么;成绩优秀是你应该做的,没什么可描述的,成绩不优秀也许人家在大学忙着创业呢?(成绩优秀不一定是好事,只能说明多元化的大学你上成了高中,没有真正上明白大学,反而体现了你死板,不爱社交,没有别的突出能力) 2.实践经历:你想表达的意思没有说清楚。你是说你会个性化服务,还是你有实习经历。如果没有带来,经济收益,表彰,更好的发展前景,那你还不如说说提升了自己哪些技能。你说有人给你送锦旗我都能明白你优秀,但是你说你会xxxx,你说这话谁信,证据呢。 3.入伍经历:你描述的就是你的工作职责或者你应该做的,并没有体现出来你把这个事情做好了,而且入伍经历并不能证明你能干好你要应聘的工作,不如只写经历其余所有内容都不写。 4.荣誉技能:重点突出一下,但不要过多描述,这些荣誉的含金量懂得都懂。 重点:你要应聘什么工作(具体岗位,实习生不具体),你的期望薪资
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务