题目
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1 输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7 输出:[]
易出问题代码:
public class Solution {
public ListNode removeElements(ListNode head, int val) {
//判断链表是否为空
if(head == null){
return null;
}
//如果头节点就是要删的元素
if(head.val == val){
head= head.next;
}
//如果要删的元素在中间,那么需要知道待删除的节点和待删除的节点的前一个节点
ListNode pre = head;//待删除节点的前一个节点
ListNode cur = head.next;//待删除节点
while (cur != null){
if(cur.val != val){
pre = pre.next;
cur = pre.next;
}else {
pre.next = cur.next;
cur = cur.next;
}
}
return head;
}
}
这样看似没有问题,实际上如果头节点和第二个节点的数值一样的话,那么该节点会被保留,不会被删除。
画图如下:
解决这个问题只需要将这两个方法的执行顺序改变即可:
之后在执行if语句,对删除后的进行判断即可。
完整代码:
class Solution {
public ListNode removeElements(ListNode head, int val) {
//判断链表是否为空
if(head == null){
return null;
}
//如果要删的元素在中间,那么需要知道待删除的节点和待删除的节点的前一个节点
//如果头节点和第二个要删除的元素,删除头节点后第二个节点就变成了头节点不会被删除,
//应该要继续执行删除头节点的逻辑
ListNode pre = head;//待删除节点的前一个节点
ListNode cur = head.next;//待删除节点
while (cur != null){
if(cur.val == val){
pre.next = cur.next;
cur = pre.next;
}else {
pre = pre.next;
cur = cur.next;
}
}
if(head.val == val){
head= head.next;
}
return head;
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-linked-list-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。