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

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


全部评论

相关推荐

头像
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务