题解 | #从单向链表中删除指定值的节点#
从单向链表中删除指定值的节点
http://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f
HJ48 从单向链表中删除指定值的节点
- 由题意可知成对输入的数据(a, b)表示以b->a的一段链表,先读入值的为待插入的节点,后读入的值为待插入节点a的前一个节点b。首先判断列表list是否为空,如果为空则先将头节点插入。如果不为空,则按照题意首先检查列表中是否已有待插入节点,若没有则通过获取节点b的索引index,由此可以得到以a节点作为尾节点的子列表temp = list.subList(0,index + 1),将待插入节点b添加至该子列表后面,子列表原有节点自动接到b节点后面。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
int total = in.nextInt(); // 节点总数
int primaryHeadNode = in.nextInt(); // 初始头结点
List<Integer> list = new LinkedList<>();
while(list.size() != total){
int back = in.nextInt();
int front = in.nextInt();
List<Integer> temp = new LinkedList();
if(temp.size() != 0){
list = temp;
temp.clear();
}
if(list.isEmpty()){
// 如果列表为空,则将初始头结点放入其中
list.add(primaryHeadNode);
if(back != primaryHeadNode && front == primaryHeadNode) list.add(back);
else list.add(front);
}else{
// 如果不为空,首先判断back节点是否已经存在于列表中,如果不存在则插入
if(!list.contains(back)){
int index = list.indexOf(front);
if(index + 1 == list.size()){
// 如果需要插入的元素在列表尾部,则直接添加至末尾
list.add(back);
}else{
temp = list.subList(0, index+1);
temp.add(back);
}
}
}
}
// 输出结果
int deleteNode = in.nextInt();
for(int num : list){
if(num != deleteNode)
System.out.print(num + " ");
}
}
in.close();
}}
查看9道真题和解析