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

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

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

/**
 * 链表,一个单元存储一个值和一个地址,如果链表中的值不重复,
 * 且以元素值作为修改依据(保证唯一性),可用一维数组代替
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) {
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        StringBuffer s = new StringBuffer();
        String a;
        try {
            a = r.readLine();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        char[] chs = a.toCharArray();
        int i = 0, j, k, l = chs.length, n = 0, check, remove;
        while (i < l) {//得到链表有多少个数
            if (chs[i] == ' ') {
                i++;
                break;
            }
            n *= 10;
            n += chs[i] - '0';
            i++;
        }
        int[] nodes = new int[2 * n];
        int[] linked = new int[n];
        parsing(nodes, chs,
                i);//获得所有数据,包括头节点,中间值,要删除的值
        linked[0] = nodes[0];//获得头节点的值
        i = 1;
        l = nodes.length;
        while (i < l -
                1) {//最后一位为删除的值,先不管,首先得到添加各节点后的链表
            check = nodes[i + 1];//要插入节点位置的节点值
            for (j = 0; j < n; j++) {
                if (linked[j] == check) break;//节点索引
            }
            k = n - 1;
            while (k > j + 1) {//数据后移
                linked[k] = linked[k - 1];
                k--;
            }
            linked[j + 1] = nodes[i];//待插入的节点值
            i += 2;//插入值和位置节点,后移两位
        }
        remove = nodes[l - 1];
        i = 0;
        while (i < n) {
            if (linked[i] != remove) s.append(
                    linked[i]).append(" ");//将剩余节点值存入链表
            i++;
        }
        System.out.print(s);
    }

    private static void parsing(int[] nodes, char[] chs, int i) {
        int l = chs.length, n = 0, j = 0;
        while (i < l) {
            if (chs[i] == ' ') {
                nodes[j++] = n;
                n = 0;
                i++;
                continue;
            }
            n *= 10;
            n += chs[i] - '0';
            if (i == l - 1) nodes[j] = n;
            i++;
        }
    }
}

全部评论

相关推荐

高斯林的信徒:问你有没有保底,好人啊,就差把这是kpi面告诉你了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务