「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。
移除链表元素
题目描述
给你一个链表的头节点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
输出:[]
解析
第一种解法:直接使用链表来进行移除元素操作
- 当链表为空时,返回空
- 当链表的头结点为所需移除元素时,删除头结点,其实只要将头结点向后移动一位就可以了
- 当上述两种情况排除时即为第三种情况,删除单链表中满足条件的结点,其实删除结点就是将需要移除结点的前一个结点的next指针指向需要移除结点的下一个结点即可
代码
public ListNode removeElements(ListNode head, int val) {
//当链表的头结点为所需移除元素时,删除头结点
while (head != null && head.val == val) {
//删除头结点的操作:将头结点向后移动一位
head = head.next;
}
// 链表为空时返回空
if (head == null) {
return head;
}
// 第三种情况,此时链表不为空,同时head.val!=val
//定义前一个结点,即可看作所需移除元素的前一个结点
ListNode pre = head;
//定义当前结点,即可看作移除元素的结点
ListNode cur = head.next;
//当前结点不为空时
while (cur != null) {
//移除元素
if (cur.val == val) {
//移除元素操作:前一个结点的next指针指向下下个结点
pre.next = cur.next;
} else {
pre = cur;
}
//继续向后操作,查找符合条件的结点然后将其删除
cur = cur.next;
}
return head;
}
第二种解法:递归
递归三要素:
- 明确这个函数想要做什么---递归函数功能
- 找出递归结束的条件
- 找出函数的等价关系式
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;
}
}