力扣 203.移除链表指定元素
1、原始题目链接
https://leetcode-cn.com/problems/remove-linked-list-elements/
2、进行解题的两种思路
2.1、 使用虚拟头结点法
这样子可以使得删除头结点以及删除非头结点使用统一的代码进行删除,不需要单独考虑头结点的情况
代码实现
/**
* 使用虚拟头结点,将所有的删除操作进行统一
* @param head
* @param val
* @return
*/
public ListNode removeElement(ListNode head, int val) {
// 当链表为空的时候,将原始的链表头结点返回回去即可
if (head == null) {
return head;
}
// 设置虚拟头结点,虚拟头结点的值可以任意,但是它指向的下一个元素就是链表的头结点
ListNode virtual = new ListNode(-1, head);
// 前面的指针指向虚拟头结点,待删除元素的前驱结点
ListNode pre = virtual;
// 后面的指针指向原始的头结点,拟待删除元素的结点
ListNode cur = head;
// cur 保证了遍历了所有的元素,将所有的元素进行了比较,保证了元素没有没遗落,空的话就是不需要进行比较了
while (cur != null) {
if (cur.val == val) {
pre.next = cur.next; // 建立链接,跳过中间需要删除的元素
} else {
pre = cur; // 到了这里说明没有找到需要删除的元素,前面的链接是稳定的, pre 到达这个 cur 的位置,当做拟删除元素结点的前驱结点
}
cur = cur.next; // 向后面遍历,寻找潜在的可以删除的元素
}
// 虚拟结点的下一个结点才是真的头结点,上述的算法,进行了删除所有元素的统一
return virtual.next;
}
2.2、直接删除法
不设置虚拟头结点,但是对于头结点的删除需要进行单独的考虑
代码实现
/**
* 不使用虚拟头结点,直接对于头结点进行特殊处理即可
*
* 进行元素的删除,首先使用普通的方法进行删除,不设置虚拟结点,直接删除即可
* @param head
* @param val
* @return
*/
public ListNode removeElements(ListNode head, int val) {
// 如果一个链表中每次删除的都是头结点,头结点后面有好几个都是待删除的元素,需要特别的进行处理
while (head != null && head.val == val) {
head = head.next;
}
if (head == null) {
return head;
}
ListNode pre = head;
ListNode cur = head.next;
while (cur != null) {
if (cur.val == val) {
pre.next = cur.next;
} else {
pre = cur; // 前面的指针直接指向当前的指针
}
cur = cur.next;
}
return head; // 返回删除后的元素的链表,就是返回链表的头结点,通过链表的头结点,可以对于链表进行遍历获取元素等操作
}
3、结点代码
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!