题解 | #从单向链表中删除指定值的节点#
从单向链表中删除指定值的节点
http://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f
- 先构建(构建就是不断的找前驱,并且添加新的节点)
- 再删除(在头节点前面添加了一个dummy节点,主要是统一删除头节点时的操作)
import java.util.*;
class ListNode{
int val;
ListNode next;
ListNode(int val, ListNode next){
this.val = val;
this.next = next;
}
ListNode(int val){
this.val = val;
}
}
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
// 构建链表
ListNode head = new ListNode(scanner.nextInt());
for(int i=1;i<n;i++){
int addVal = scanner.nextInt(); //表示插入节点
int preVal = scanner.nextInt(); //表示插入节点的前驱节点
ListNode p = head;
// 在链表中寻找前驱节点
while(p!=null){
if(p.val==preVal){
break;
}
p = p.next;
}
// 寻找到之后将addVal插入到前驱节点之后
ListNode addNode = new ListNode(addVal,p.next);
p.next = addNode;
}
int delVal = scanner.nextInt();
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode p = head, pre = dummy;
while(p!=null){
if(p.val == delVal){
pre.next = p.next;
p=p.next;
}else{
p=p.next;
pre = pre.next;
}
}
head = dummy.next;
p = head;
StringBuilder ans = new StringBuilder();
while(p!=null){
ans.append(p.val).append(" ");
p = p.next;
}
ans.deleteCharAt(ans.length()-1);
System.out.println(ans.toString());
}
}