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

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

https://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f

这道题要想做对第一步要理解题意

题意的意思是说刨除去前面两个数,从第三个数起,两两为一组来构建列表,构建的方式是每一组的第二个数是原链表的数,第一个数是要插入的数,要插入的数的位置就是第二个数所在链表位置的后面。由于这道题告诉我们不会有重复的数字,所以不会造成不知道该插入哪个位置的情况。所以构建链表的过程一定要按照题意。我刚刚开始就想当然自己常规构建,结果那就是一个错误百出。

接下来就两件事儿,

1、从链表当中删除某个数字

这也不能大意,你一大意跟我似的,忘了写链表指针移动那一行,那就是个死循环,多酸爽。

2、打印链表,由于我们已经构建了链表,打印就易如反掌了。也要注意打印的顺序。你打印反了,机器考试的时候也会一脸懵啊,

时间复杂度是O(n)

空间复杂度O(n)

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String ss = in.nextLine();
        String[] sss = ss.split(" ");
        int n = Integer.parseInt(sss[0]);
        int toDelete = Integer.parseInt(sss[sss.length - 1]);
        Node prev = new Main.Node();
        buildChain(prev, sss);
        deleteOne(prev, toDelete);
        print(prev.next);


    }

         private static void print(Main.Node prev) {
        // TODO
      
        while (prev!=null){
            System.out.print(prev.data);
            System.out.print(" ");
            prev=prev.next;
        }

    }

    private static void deleteOne(Main.Node prev, int toDelete) {
        Main.Node temp = prev;
        while (temp.next != null) {
            if (temp.next.data == toDelete) {
                temp.next = temp.next.next;
            }
            //易错点:需要移动步伐,不要忘了!!!!
            temp = temp.next;
        }
    }

    private static void buildChain(Main.Node prev, String[] sss) {
        int start = Integer.parseInt(sss[1]);
        Node one = new Node();
        one.data = start;
        prev.next = one;
        Set<Integer> set = new HashSet<>();
        set.add(one.data);

        for (int i = 2; i < sss.length - 1; i += 2) {
            if (!set.contains(sss[i])) {
                link(prev, sss[i], sss[i + 1]);
                set.add(Integer.parseInt(sss[i]));

            }
        }

    }

    private static void link(Node prev, String toInsert, String hasInsert) {
        Node temp = prev;
        while (temp.next != null) {
            if (temp.next.data == Integer.parseInt(hasInsert)) {
                Node node = new Node();
                node.data = Integer.parseInt(toInsert);
                Node secondLink = temp.next.next;
                temp.next.next = node;
                if (secondLink != null) {
                    node.next = secondLink;
                }
                break;
            }
            temp = temp.next;
        }
    }

    private static Node buildChain(Main.Node prev, String[] sss, int index) {

        if (index < (sss.length - 2)) {
            Node priv = buildChain(prev, sss, index + 1);
            Node temp = new Node();
            temp.data = Integer.parseInt( sss[index]);
            priv.next = temp;
            return temp;
        } else {
            Node temp = new Node();
            temp.data = Integer.parseInt( sss[index]);
            prev.next = temp;
            return prev.next;
        }
    }

    public  static class Node {
        public int data;
        public  Node next;
        public  void Node() {};

    }
}

全部评论

相关推荐

机械打工仔:有说的你怀疑一下就行了,直接问也太实诚了
点赞 评论 收藏
分享
06-26 22:20
门头沟学院 Java
码农索隆:让你把简历发给她,她说一些套话,然后让你加一个人,说这个人给你改简历,然后开始卖课
我的求职精神状态
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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