题目
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
思路
一种是 直接使用原来的链表来进行删除操作,一种是设置一个虚拟头结点在进行删除操作。
1.直接删除
代码如下(示例):
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//直接删除法
//删除头结点
while(head != NULL && head->val == val){
ListNode* tmp = head;
head = head->next;
delete tmp;
}
ListNode* cur = head;
while (cur != NULL && cur->next!= NULL) {
//删除非头结点
if (cur->next->val == val) {
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
} else {
cur = cur->next;
}
}
return head;
}
};
2.设置虚拟头结点
代码如下(示例):
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//设置虚拟头结点
ListNode* fakeHead = new ListNode(0);
fakeHead->next = head;
//正常删除结点
ListNode* cur = fakeHead;
while(cur->next != NULL) {
if(cur->next->val == val) {
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
} else{
cur = cur->next;
}
}
return fakeHead->next;
}
};
最后不要忘了return新的头结点。
总结
如果使用java ,python的话就不用手动管理内存了。
就算使用C++来做leetcode,如果移除一个节点之后,没有手动在内存中删除这个节点,leetcode依然也是可以通过的,只不过,内存使用的空间大一些而已,但建议依然要养生手动清理内存的习惯。