题目要求:给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足
Node.val == val
的节点,并返回 新的头节点 。
假设有三个节点A B C , 链表删除可表示为
代码可表示为 A->next = A->next->next
表示A节点的下一个元素从节点B(A->next) 指向 C(A->next->next)
但是从上述删除结点的例子中,需要三个节点才能完成删除。如果头节点也满足删除条件
head->val == val 就无法实现,所以要先判断头节点。
if(head!=null && head->val == val){
head = head->next; //把头节点的下一个值赋值给头节点
}
显然,使用if判断仍有缺陷 , 因为只能删除一个节点,如果后续仍有节点满足,则无法满足题意。
假设需要删除的val 的值为1 , 下图则需要删除三个节点,需要用while循环遍历后续节点判断是否应该删除。
所以
while(head!=null && head->val == val){
head = head->next; //把头节点的下一个值赋值给头节点
}才是正确写法
注意, 将head 赋给一个临时变量: ListNode cur = head;
保证head作为头节点,保留对头部的引用。
完整代码:
class Solution {
public ListNode removeElements(ListNode head, int val) {
while(head!=null && head.val == val){
head = head.next;
}
ListNode cur = head;
while(cur!= null && cur.next!=null){
if(cur.next.val == val){
cur.next = cur.next.next;
}else{
cur = cur.next;
}
}
return head;
}
}