**给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。(来源力扣)
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]**
思路分析:
解决该题的方式有两种:
- 【直接使用原来的链表进行删除操作】
- 【通过设置一个虚拟的链表头节点进行删除操作】
做法一:使用原始链表去进行删除操作
/*
定义:ListNode temp=head
注意:移除其它节点通过其它节点的前一个节点去删除,比如要删除temp.next这个节点,temp.next=temp.next.next;即可
而删除头结点则采用if(temp.val==val){ head=temp.next; }
*/
public ListNode removeElements1(ListNode head, int val) {
ListNode temp=head;
if(temp==null){
return temp;
}
//确定头节点的位置
while(temp.val==val&&temp.next!=null){
head=temp.next;
temp=temp.next;
}
if(temp.val==val){
head=null;
}
//将值相同的节点删除
while(temp.next!=null){
if(temp.next.val==val&&temp.next.next!=null){
temp.next=temp.next.next;
}else if(temp.next.val==val&&temp.next.next==null){
temp.next=null;
break;
}else{
temp=temp.next;
}
}
if(temp.val==val){
temp=null;
}
return head;
}
做法二:使用虚拟头结点去进行链表节点的删除操作
/*
所有节点的操作都通过前一个节点去删除,最后返回结果就是虚拟头结点的下一个节点。
*/
public ListNode removeElements2(ListNode head, int val) {
ListNode tempNode=new ListNode();
tempNode.next=head;
ListNode curNode=tempNode;
while(curNode.next!=null){
if(curNode.next.val==val&&curNode.next.next!=null){
curNode.next=curNode.next.next;
}else if(curNode.next.val==val){
curNode.next=null;
break;
}else{
curNode=curNode.next;
}
}
return tempNode.next;
}