题目描述
输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
详细描述:
本题为考察链表的插入和删除知识。
链表的值不能重复
构造过程,例如
1 <- 2
3 <- 2
5 <- 1
4 <- 5
7 <- 2
最后的链表的顺序为 2 7 3 1 5 4
删除 结点 2
则结果为 7 3 1 5 4
此题思路不难,难在理解很坑的题目描述如4 <- 5的意思,还有一个坑的地方在于输出不但要加空格,还要最后一个数字还要加换行符,不过有的题却不用加,没有统一的标准。 还有的题List不导入他会给你到其他包的List,这种编译器就很坑了。
另外牛客网通常不会因为暴力算法而超时,凡是超时都是自身的原因,如循环的问题是否为死循环,一个 p = p.next忘了加导致了额外调试1个小时。
import java.util.*;
class ListNode{
int val;
ListNode next;
ListNode(int val){
this.val = val;
}
}
public class Main{
//碰到看不懂的测试用例,一定要看题目描述部分
public static void insert(ListNode dummy, int indexVal, int newVal){
ListNode p = dummy.next;
while(p != null && p.val != indexVal){
p = p.next;
}
ListNode newNode = new ListNode(newVal);
newNode.next = p.next;
p.next = newNode;
}
public static void delete(ListNode dummy, int delVal){
ListNode p = dummy;
while(p.next != null && p.next.val != delVal){
p = p.next;
}
p.next = p.next.next;
}
public static void printList(ListNode dummy){
ListNode p = dummy.next;
while(p != null){
System.out.print(p.val + " ");
//这一个疏忽导致我浪费了一个小时调试
p = p.next;
}
System.out.println();
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
ListNode dummy = new ListNode(0);
int num = sc.nextInt();
int headVal = sc.nextInt();
ListNode head = new ListNode(headVal);
dummy.next = head;
for(int i = 0; i < num - 1; i++){
int newVal = sc.nextInt();
int indexVal = sc.nextInt();
insert(dummy, indexVal, newVal);
}
int delVal = sc.nextInt();
delete(dummy, delVal);
printList(dummy);
}
sc.close();
}
}