问题:
给你一个链表的头节点 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
输出:[]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-linked-list-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
1.遍历节点
2.递归判断
解法:
方法一:
判断头节点是否为我们要删除的节点,再判断删除完以后这个节点是否为空,再对遍历节点的下一个节点进行判断。
/**
* 迭代判断头指针法
*
* @param head
* @param val
* @return
*/
public ListNode removeElements01(ListNode head, int val) {
//先判断头节点是否为我们要删除的
while (head != null && head.val == val) {
head = head.next;
}
//删除后的头节点是否为null
if (head == null) {
return head;
}
ListNode node = head;
//每次对遍历节点的下一个节点进行操作
while (node.next != null) {
if (node.next.val == val) {
node.next = node.next.next;
} else {
node = node.next;
}
}
return head;
}
方法二:
避开了开头的判断,给他创建一个虚拟的头节点,然后将这个链表挂在这个虚拟的头节点下,再对这个虚拟头节点后面的每个节点遍历删除对应的节点。
/**
* 迭代虚拟头指针法
*
* @param head
* @param val
* @return
*/
public ListNode removeElements02(ListNode head, int val) {
//创建一个虚拟头节点
ListNode myHead = new ListNode();
//将我们要操作的节点挂在虚拟头节点后
myHead.next = head;
ListNode node = myHead;
while (node.next != null) {
if (node.next.val == val) {
node.next = node.next.next;
} else {
node = node.next;
}
}
//返回虚拟头节点的下一个节点
return myHead.next;
}
方法三:
递归调用:先判断头节点是否为空,然后一直递归到链表的最后,如果当前递归的节点是我们要删除的就把他的下一个节点返回回去。
/**
* 递归
* @param head
* @param val
* @return
*/
public ListNode removeElements03(ListNode head, int val) {
//判断传进来的节点是否为空
if (head == null) return null;
//一直找到最后一个节点
head.next=removeElements03(head.next,val);
//判断这个节点是否要删除删除就把,他的下一个节点,返回给上一个节点
return head.val==val?head.next:head;
}