题目要求
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
图解
配合思路过程一起看更容易理解
思路过程
1.删除链表中所有满足的Node.val==val的节点?
怎么删除?
删除思路: 假设我们删除val=2的节点,那么我们首先就要遍历整个链表,其次删除2就等同于把1指向3,然后3也要指向5。
删除方法: 使1的next指向3的地址(也就是2的next)
prev. next = cur. next//删掉了一个2
cur = cur. next;//再往后面看还有没有2,也就是继续遍历的意思
2.思路过程中又出现了一些小问题:
prev怎么求?遍历怎么停下来?删除的是第一一个节点prev怎么来........
我们一步一步来
prev怎么求?删除的是第一一个节点prev怎么来?
直接从第二个节点开始考虑,第一个节点作为特殊节点特殊考虑。此时
NodeList prev = head;//头节点给prev
NodeList cur = head. next;//第二个节点给head
遍历怎么停下来?
while ( cur != null) ;
当cur = nul1的时候就是val =5的时候next给
的,此时就代表遍历结束了。
当删除第一个节点该怎么办?
直接进行判断是不是删第一个节点,也就是头结点,如果是把头节点甩给下一个节点。
if(head.val == key) head = head.next;
如果只有一个节点要删吗?
只有一个节点就不能删了,做人要留一线,此时就代表只剩一个头结点了。
**if(head == null) return null;
完整代码
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null) {
return null;
}
ListNode prev = head;
ListNode cur = head.next;
while (cur != null) {
if(cur.val == val) {
prev.next = cur.next;
cur = cur.next;
} else {
prev = cur;
cur = cur.next;
}
}
//对头结点为val进行判断
if(head.val == val) {
head = head.next;
}
return head;
}
}