题解 | #从单向链表中删除指定值的节点#
从单向链表中删除指定值的节点
https://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNext()) { // 注意 while 处理多个 case
//输入的第一个值:节点个数
int n = in.nextInt();
//输入的第二个值:头节点的值,其实是首元节点
int headVal = in.nextInt();
ListNode listNode=new ListNode(headVal);
//辅助指针
ListNode temp=listNode;
//输入的第3~倒数第2个数,共n-1(以偶数个数出现)个:各节点(除了头节点)的值
for(int i=0;i<n-1;i++){
//每次重置头指针
ListNode head=listNode;
int back=in.nextInt();
int front=in.nextInt();
//将back插在front的后面
while(head!=null){
if(head.val==front){
ListNode node=new ListNode(back);
//插入front的后面
node.next=head.next;
head.next=node;
break;
}else{
head=head.next;
}
}
}
ListNode mark=new ListNode(0);
ListNode start=mark;
//真正的头节点
mark.next=temp;
//输入的最后一个值:要删除的节点值
int del=in.nextInt();
//删除逻辑:双指针
while(temp!=null){
if(temp.val==del){
temp=temp.next;
mark.next=temp;
}else{
temp=temp.next;
mark=mark.next;
}
}
start=start.next;
while(start!=null){
System.out.print(start.val+" ");
start=start.next;
}
}
}
}
class ListNode{
int val;
ListNode next;
public ListNode(int val){
this.val=val;
this.next=null;
}
}
稍稍有点麻烦,别让指针绕晕了就行