一、题目
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
示例 1:

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1
输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[]
二、思路
不难发现题目所给的是单链表,那么在单链表删除元素时一定要注意:我们必须要先拿到被删除节点的前驱,再让前驱指向被删除节点的后继。
在思考的过程中,发现头节点的前驱好像找不到,该如何呢?
实际上,我们只需要让head = head->next 即可删除头节点(别忘了回收节点,java中有gc机制就不用回收了。)头节点的操作需要单独处理。
第二种方法,可以添加虚拟节点,将旧头节点和其他节点的删除操作统一。
三、代码
java
public class removeElements {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要删除的值:");
int valToRemove = sc.nextInt();
System.out.println("请输入链表的元素,输入非数字结束:");
ListNode head = new ListNode(sc.nextInt());
ListNode current = head;
//创建单链表
while (sc.hasNextInt()) {
int value = sc.nextInt();
current.next = new ListNode(value);
current = current.next;
}
ListNode resultHead = removeElements(head, valToRemove);
printList(resultHead);
}
public static ListNode removeElements(ListNode head, int val) {
/*//第一种方法,不加虚拟节点
//删除值相同的头结点后,可能新的头结点也值相等,用循环解决
while(head!=null && head.val==val) {
head = head.next;
}
ListNode curr = head;
while(curr!=null && curr.next !=null) {
if(curr.next.val == val){
curr.next = curr.next.next; //删除节点
} else {
curr = curr.next;
}
}
return head;*/
//第二种方法,添加虚拟头节点,这样将旧头节点和其他节点的删除操作统一
ListNode dummy = new ListNode();
dummy.next = head;
ListNode cur = dummy; //这里不能等于dummy.next,否则会丢失头结点
while(cur.next != null){
if(cur.next.val == val) {
cur.next = cur.next.next;
}else{
cur = cur.next;
}
}
return dummy.next;
}
private static void printList(ListNode head) {
ListNode current = head;
while (current != null) {
System.out.print(current.val + " ");
current = current.next;
}
System.out.println();
}
}