题目描述
解题思路
简单题,没啥好说的,有两种删除的方法,一种是找前驱节点然后删,还有一种是和后继节点的值进行交换然后删后继节点,这里我就用比较常见的找前驱节点的方法来删吧,复杂度都一样。【还有一种递归的方式】
另外,对于链表题,一般我们都会添加一个虚拟头节点方便操作(注意:返回的是这个虚拟头节点的后继节点,即第一个元素节点,不能直接返回虚拟头节点,LeetCode 会报错):
代码演示:
方法一:找前驱节点然后删
package com.kami.leetcode.list_study;
import com.kami.leetcode.list_study.listNode.ListNode;
/**
* @Description: TODO
* @author: scott
* @date: 2021年12月08日 10:10
*/
public class Solution_203 {
public ListNode removeElements(ListNode head, int val){
//添加一个虚拟头节点
/**
* 一般我们都会添加一个虚拟头节点方便操作(注意:返回的是这个虚拟头节点的后继节点,即第一个元素节点,不能直接返回虚拟头节点,LeetCode 会报错)
*/
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pro = dummy;
ListNode cur = head;
while(cur != null){
if(cur.val == val){
//删除节点
pro.next = cur.next;
}else {
pro = cur;
}
cur = cur.next;
}
return dummy.next;
}
}
方法二:递归
package com.kami.leetcode.list_study;
import com.kami.leetcode.list_study.listNode.ListNode;
/**
* @Description: TODO
* @author: scott
* @date: 2021年12月08日 10:10
*/
public class Solution_203 {
public ListNode removeElements(ListNode head, int val){
if(head == null){
return head;
}
head.next = removeElements(head.next, val);
return head.val == val ? head.next : head;
}
}