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