题解:删除链表节点的三种方法
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @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;
}
}