题解 | #从单向链表中删除指定值的节点#
从单向链表中删除指定值的节点
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++; } } }