目录
一些知识点
- 移除头结点和移除其他节点的操作不一样,只要将头结点向后移动一位就可以,这样就从链表中移除了一个头结点。
- C++删除结点要从内存中删除移除的节点, 清理节点内存
- 一般虚拟头结点:dummyHead ; 当前:cur ; 新结点:newNode ; 要删除的结点:tmp
【题目203】
删除链表中等于给定值 val 的所有节点。
【示例】
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
【方法1】:直接使用原来的链表来进行移除
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
// 删除头结点
while (head != NULL && head->val == val) { // 注意这里不是if
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* dummyHead = new ListNode(0); // 设置一个虚拟头结点
dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作
ListNode* cur = dummyHead;
while (cur->next != NULL) {
if(cur->next->val == val) {
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
} else {
cur = cur->next;