/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
//思路:遍历链表,如果指针指向的值等于val的值,就把这个链表的节点去掉,返回剩下的链表,但是第一个节点没法通过把它前一个节点的指针指向它的下一个节点,于是增加了一个虚拟节点,这样第一个节点就和其他节点一样,可以通过同一种方式去掉。
//先给出一个边界值
if(head == null ){
return null;
}
//新建一个虚拟节点
ListNode dummy = new ListNode(-1);
//把dummy指向head
dummy.next = head;
//pre指针指向虚拟节点
ListNode pre = dummy;
//cur指针指向头节点
ListNode cur = head;
//遍历链表
while(cur != null){
//如果当前cur指针指到的值和给定的val值一样
//就把pre指针指向,cur的下一个节点
if(cur.val == val) {
pre.next = cur.next;
}else{//否则,把pre移动,指到和cur一样的位置
//突然恍惚,为什么 pre = cur;就是指向一样的位置,因为cur指向的是一个地址,把这个地址赋值给pre,那么pre也指向这个地址
pre = cur;
}
//cur继续移动
cur = cur.next;
}
//返回剩下的链表
return dummy.next;
}
}