203.移除链表元素
思路1(迭代):
- 判断 链表为空 或者 链表开头几个有要删除的val值, 使head指向下一个
- 创建 node 指向新 head, 再根据 node.next的val值,判断是否要删除
注意:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e5ca9414a3359370eafb287d3959cfcf.png)
- 此处必须是 else 时才能 node = node.next; 不然会漏判断
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/671b4fa0e7d1529ef68bc7f081ab8aaf.png)
- 这种判断是错误的,不能删除最后一个节点。
- node.next = null 和 最后一个节点node = null 不是一回事
第一个成功把最后一个节点删除了 第二个没有修改到head链表,没有修改到node.next,所以没有删除成功
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/95b44a76f1685f1c17392a928d6ed7fe.png)
- 顺序不能反,否则会出错,比如全是 7,顺序反了就出错了。
代码实现
class Solution {
public ListNode removeElements(ListNode head, int val) {
while (head != null && head.val == val) {
head = head.next;
}
if (head == null) return head;
ListNode node = head;
while (node.next != null) {
if (node.next.val == val) {
node.next = node.next.next;
} else {
node = node.next;
}
}
return head;
}
}
思路2(递归):
- 找出 递归退出条件 if (head == null) return null;
- 参数用 head.next, 并用 head.next 接收,就可以进行 head的val值判断,并方便删除
代码实现
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null) return null;
head.next = removeElements(head.next, val);
if (head.val == val) {
return head.next;
} else {
return head;
}
}
}