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