给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
示例 1
输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
思路一:指针

通过设置虚拟头结点和头结点
public ListNode removeElements(ListNode head, int val){
//初始化一个虚拟结点
ListNode dummy = new ListNode(0);
ListNode cur = dummy;
//当前节点指向头结点
cur.next = head;
while(cur != null && cur.next != null){
if(cur.next.val == val)
//删除的是cur后面的一个结点,若cur.next.val == val,则删除结点
cur.next = cur.next.next;
else
//若不相等则当前结点向后移动
cur = cur.next;
}
//返回虚拟结点的下一个结点
return dummy.next;
}
若不添加虚拟节点,则
public ListNode deleteNode(ListNode head, int val) {
//边界条件判断
if (head == null)
return head;
//如果要删除的是头结点,直接返回头结点的下一个结点即可
if (head.val == val)
return head.next;
ListNode cur = head;
//找到要删除结点的上一个结点
while (cur.next != null && cur.next.val != val) {
cur = cur.next;
}
//删除结点
cur.next = cur.next.next;
return head;
}
思路二:递归
采用递归的方法删除相等的结点,注意递归的终止条件。
public ListNode deleteNode(ListNode head, int val) {
//当头结点为空时,无法删除,直接返回head
if (head == null)
return head;
//当头结点等于val时,返回head下一个结点
if (head.val == val)
return head.next;
//递归删除
head.next = deleteNode(head.next, val);
return head;
}
本文介绍了两种有效的链表节点删除方法:使用指针迭代和递归方式。通过设置虚拟头结点简化边界条件处理,或者直接处理特殊情况,实现了指定值节点的删除。同时提供了详细的代码实现。

被折叠的 条评论
为什么被折叠?



