Leetcode:203.移除链表元素
编辑
18
2024-05-17
Leetcode题目链接:203. 移除链表元素
题目描述:
给你一个链表的头节点 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
输出:[]
解题思路:
添加虚拟头节点,循环遍历删除
添加虚拟头节点 dummyHead 以实现链表第一个元素与链表中其他元素的统一删除操作,且dummyHead的指针指向实际链表的第一个元素位置
定义遍历指针 current 指向当前的虚拟头节点
这里我们将要删除的节点定义为 current -> next,那么当前删除节点的前驱节点为 current,当前删除节点的后继节点为current -> next -> next
删除节点的步骤:
记录要删除的节点的位置 即temp = current -> next
将该节点的前驱节点与后继节点通过next指针链接上,保证链表的完整性,即current -> next = current -> next -> next
手动释放当前要删除的节点的指针,即delete temp
以上完成了一次删除操作,循环执行
若要删除的节点不满足条件,则执行current = current -> next 跳过当前节点
最终返回实际的表头节点(注意这里是dummyHead -> next而不是head)
我的答案:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//创建虚拟头节点
ListNode* dummyHead = new ListNode();
dummyHead -> next = head;
//遍历链表
ListNode* current = dummyHead;
while(current -> next != NULL){
if(current -> next -> val == val){
ListNode* temp = current -> next;
current -> next = current -> next -> next;
delete temp;
}else{
current = current -> next;
}
}
//返回链表实际的头节点
return dummyHead -> next;
}
};
提交结果:
- 0
- 0
-
赞助
AliPayWeChat Pay -
分享