题目:
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
思路:
①单链表中只有头节点没有前驱,投机欸但需要额外处理;若头节点就是待删除节点,就是用while判断,这里是因为删除后的新的头节点还有可能是待删除的节点。
这里还有一个要注意的点,while循环的判断条件不能 (head.val == val && head != null),因为循环中的 head.val == val 可能为NULL ,此时就会出现空指针异常!!!
while (head != null && head.val == val) {
head = head.next;
}
②还要进行特殊情况的判断:链表中全部元素都是要删除的情况
if (head == null) {
return null;
}
③Node.prev = head,把头节点赋给指针prev。
从头结点开始,prev一定不是待删除的节点,因为如果第一个是要删除的,那么会导致prev永远删不掉。
这样情况下,因为prev一定不是待删除的节点,那么我们只需从prev后面一个节点开始判断是否删除,prev.next.val = val ,这样就可以得出循环结束的条件为:prev.next != null 。
这样只有 prev.next 不是待删除的节点的时候,指针prev才会向后移 prev = prev.next。
总上所述动态图为:
代码为:
public ListNode removeElements(ListNode head, int val) {
while (head != null && head.val == val) {
head = head.next;
}
if (head == null) {
return null;
} else {
ListNode prev = head;
while (prev.next != null) {
if (prev.next.val == val) {
ListNode node = prev.next;
prev.next = node.next;
} else {
prev = prev.next;
}
}
return head;
}
}