指针、引用、一级指针、二级指针问题

#问题
删除链表中相同元素时,采用delete_x1(Node** L,int x),能正常删除元素,并且不会断链,但使用delete_x1(Node* L,int x),不能正常删除元素,会造成断链

#include<iostream>
using namespace std;
struct Node{
    int val;
    Node* next;
    Node():next(NULL){}
    Node(int val):val(val),next(NULL){}
};
void delete_x1(Node*& L,int x){
    if(L == NULL)return;
    Node* p;
    if(L->val == x){
        p=L;
        L=L->next;
        free(p);
        delete_x1(L,x);
    }else{
        delete_x1(L->next,x);
    }
}
void delete_x2(Node* L,int x){
    if(L == NULL)return;
    Node* p;
    if(L->val == x){
        p=L;
        L=L->next;
        free(p);
        delete_x2(L,x);
    }else{
        delete_x2(L->next,x);
    }
}
int main()
{
    Node* head = new Node(1);
    Node* p = head;
    Node* p1 = head;
    //头插法插入结点 
    for(int i=2;i<=4;i++){
        Node* tmp = new Node(i);
        tmp->next = head->next;
        head->next = tmp;
    }
    //头插法插入结点 
    Node* t1 = new Node(2);
    t1->next = head->next;
    head->next = t1;
    //头插法插入结点 
    Node* t2 = new Node(2);
    t2->next = head->next;
    head->next = t2;
    cout<<"删除前:";
    while(p!=NULL){
        cout<<p->val<<" ";
        p=p->next;
    }
    delete_x1(head,2);    //采用二级指针,不会断链? 
//    delete_x2(head,2); 采用一级指针,会断链? 
    cout<<"删除后:";
    while(p1!=NULL){
        cout<<p1->val<<" ";
        p1=p1->next;
    }
    return 0;
}

请问为什么使用函数 delete_x1(Node*& L,int x) 可以正常删除,不会造成断链
函数delete_x1 运行结果

img

传入函数参数,都是复制,所以传入指针,等于复制一个指针。你修改指针指向的东东,函数结束后自然会有效果,而修改指针本身,因为是复制所以,函数结束后,原来的参数不会改变。
传二级指针,那么修改的其实是那个二级指针指向的一级指针,自然会有效果