移除链表元素
题目描述
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
解题思路
这道题就是考察大家对于链表的理解,只要学习了链表的结构和基本操作就可以尝试去解答这道题目了。
我们知道如果链表需要移除一个元素,就是将节点x的前一个节点的next指向节点x的后一个节点,那么在这个链表中x自然不会存在。但是在内存中节点x仍然存在,这片内存就是泄露了(开个坑,年后写一篇关于内存泄漏的文章),所以需要我们去手动删除(C++需要delete)(C#存在着内存管理机制,可以自动释放也可以手动调用)
但是分析完题目我们会发现,如果头节点的值等于目标值,那么我们没有前置节点,所以我们需要给一个虚拟的头结点用于指向目标链表,然后进行链表的遍历和删除操作。
题解
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* vhead = new ListNode(0);
vhead->next = head;
ListNode* curp = vhead;
while(curp->next != nullptr){
if(curp->next->val == val){
ListNode* temp = curp->next;
curp->next = temp->next;
delete temp;
}
else{
curp = curp->next;
}
}
head = vhead->next;
delete vhead;
return head;
}
};
总结
本体的难点就是如何去处理头结点,这里展示的是一种取巧的方法,大家也可以对头结点进行单独的处理也可以达到一样的效果。
982

被折叠的 条评论
为什么被折叠?



