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

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

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

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        // while (in.hasNextInt()) { // 注意 while 处理多个 case
        //     int a = in.nextInt();
        //     int b = in.nextInt();
        //     System.out.println(a + b);
        // }
        int n = in.nextInt();
        int[] arr = new int[2 * n];
        int index = 0;
        while (index < 2 * n) {
            arr[index] = in.nextInt();
            index++;
        }

        Node head = new Node(arr[0]);
        for (int i = 1; i < 2 * n - 1; i++) {
            if (arr[i] == head.v) {
                // Node second = find(head, arr[i - 1]);
                Node second = new Node(arr[i - 1]);
                second.next = head.next;
                head.next = second;
            } else if (i % 2 == 0) {
                Node pre = find(head, arr[i]);
                Node next = find(head, arr[i - 1]);
                if (pre == null && next == null) {
                    pre = new Node(arr[i]);
                    next = new Node(arr[i - 1]);
                    pre.next = next;
                } else if (pre == null && next != null) {
                    Node oldPre = findPre(head, next.v);
                    pre = new Node(arr[i]);
                    oldPre.next = pre;
                    pre.next = next;
                } else if (pre != null && next == null) {
                    next = new Node(arr[i - 1]);
                    next.next = pre.next;
                    pre.next = next;
                } else if (pre != null && next != null) {
                    Node oldPre = findPre(head, next.v);
                    oldPre.next = next.next;
                    next.next = pre.next;
                }
            }
        }

        Node node = head;
        while (node != null) {
            if (arr[2 * n - 1] == node.v) {
                node = node.next;
                continue;
            }
            System.out.print(node.v + " ");
            node = node.next;
        }
    }
    private static Node find(Node head, int v) {
        Node node = head;

        while (node != null) {
            if (node.v == v) {
                return node;
            } else {
                node = node.next;
            }
        }
        return null;
    }

    private static Node findPre(Node head, int v) {
        Node node = head;

        while (node != null) {
            if (node.next.v == v) {
                return node;
            } else {
                node = node.next;
            }
        }
        return null;
    }
}

class Node {
    int v;
    Node next;

    Node (int v) {
        this.v = v;
    }
}

全部评论

相关推荐

找到实习就改名4月17日下午更改:1600一个月?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务