题解:删除链表节点的三种方法

    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param val int整型 
     * @return ListNode类
     */
    public ListNode deleteNode (ListNode head, int val) {
        // 方法一:先删除头结点,在删除中间结点(借助两个指针)
        //单独讨论头结点
        while(head!=null && val==head.val){
            head=head.next;
        }
        //空指针异常
        if(head == null){
            return null;
        }
        //prev为头指针
        ListNode  prev=head;
        //curr为头指针的下一个结点
        ListNode  curr=head.next;
        //删除中间结点
        while(curr!=null){
            if(val==curr.val){
                //prev指向新的结点
                prev.next=curr.next;
                curr=curr.next;
            }else{
                //移动prev
                prev=curr;
                curr=curr.next;
            }
        }
        return head;
        
        //方法二:借助辅助头结点,不需要考虑头结点(借助两个指针)
        ListNode node=new  ListNode(-1);
        node.next=head;
        //prev指向辅助头结点
        ListNode prev=node;
        //curr指向辅助头结点的下一个结点
        ListNode curr=node.next;
        while(curr!=null){
            if(val==curr.val){
                 //prev指向新的结点(删除结点)
                prev.next=curr.next;
                curr=curr.next;
            }else{
                //移动prev
                  prev=curr;
                  curr=curr.next;
            }
        }
        return  node.next;
        
        //方法三:借助辅助头结点,不需要考虑头结点(借助一个指针)
        ListNode node=new  ListNode(-1);
        node.next=head;
        //指向辅助头指针
        ListNode  curr=node; 
        while(true){
            if(curr.next==null){
                break;
            }
            if(val==curr.next.val){
                //删除结点
                curr.next=curr.next.next;
            }
            else{
                //不相等,移动curr
                 curr=curr.next;
            }
        }
        return node.next;
    }
}