1.题目描述
给你一个链表的头节点 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
输出:[]
提示:
列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-linked-list-elements著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.题解
2.1 遍历
2.1.1 思路
这里用到了链表中很常用的一个节点,叫做哑节点,简单解释一下就是没有用的空的节点。
哑节点是为了能够直接从头节点开始,防止遍历之后找不到头节点。
代码思路是:
- 首先用哑节点指向头节点,然后用一个指针指向哑节点
- 然后通过判断该指针指向的头节点的值是否为目标值,如果是,就跳过这个头节点;反之就将指针向后移,判断头节点的下一个节点
- 遍历完之后,返回哑节点的下一个节点
2.1.2 java
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode prehead = new ListNode(0);
prehead.next = head;
ListNode pre = prehead;
while(pre != null&&pre.next != null){
int tempval = pre.next.val;
if(tempval == val){
pre.next = pre.next.next;
}
else{
pre = pre.next;
}
}
return prehead.next;
}
}
2.2 递归
2.2.1 思路
递归的思路要更为简单一些,递归的思想就是先判断头节点是不是为目标值,然后通过该函数判断剩下的链表。
递归有三要素:参数和返回值,终止条件,单层递归逻辑。
- 参数和返回值已经定好了
- 终止条件:如果头节点为空了,那么就已经到尾节点了,那就可以终止了
- 单层递归逻辑:判断头节点的值是否为目标值,剩下的放进去递归。如果头节点的值为目标值,那头节点就不要了,直接返回子链表的递归返回值;如果不为头节点,那就将头节点接上子链表的递归返回值,再返回。
2.2.2 Java代码
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null){
return null;
}
else if(head.val == val){
return removeElements(head.next,val);
}
else{
ListNode temp = removeElements(head.next,val);
head.next = temp;
return head;
}
}
}