题目:
删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4->5
思路:
删除链表节点分为两种情况:
1、删除的节点在头节点或头节点以下连续的位置
这种情况可以通过设置哨兵节点解决
2、删除的节点不在头节点的位置
- 选择要删除节点的前一个结点
prev
。 - 将
prev
的next
设置为要删除结点的next
。
算法:
1、初始化哨兵节点为 ListNode(0) 且设置 sentinel.next = head。
2、初始化两个指针 curr 和 prev 指向当前节点和前继节点。
3、当curr != nullptr:
3.1 比较当前节点和要删除的节点:
3.1.1 若当前节点就是要删除的节点:则 prev.next = curr.next。
3.1.2 否则设 prve = curr。
3.2 遍历下一个元素:curr = curr.next。
4、返回 sentinel.next。
代码:
public static ListNode removeElements(ListNode head, int val) {
ListNode sentinel = new ListNode(0);//哨兵
sentinel.next = head;
ListNode prev = sentinel,curr = head;
while (curr!=null){
if (curr.val == val){
prev.next = curr.next;
}else{
prev = curr;
}
curr = curr.next;
}
return sentinel.next;
}