Leetcode203(代码随想录:移除链表元素)
循环过程需要设置一个临时指针p,C++delete才需要设置另一个临时指针temp。
C++代码:
遇到报错:member access within null pointer of type 'ListNode' (solution.cpp)
错误含义:在 "ListNode "类型的空指针内访问成员 (solution.cpp)
原因分析:当时的判断是这样写的while(head->val == val && head != nullptr),没有先判断指针是否为NULL就对结点进行操作,测试系统不知道当前的结点与结点的下一个结点是否为NULL,所以报错。
原链表删除元素:
/**
* 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) {
while(head != nullptr && head->val == val)
{
ListNode *temp = head;
head = head->next;
delete temp; //不能忘了手动管理内存
}
ListNode *p = head;
while(p != nullptr && p->next != nullptr)
{
if(p->next->val == val)
{
ListNode *temp = p->next;
p->next = p->next->next;
delete temp; //不能忘了手动管理内存
}
else
p = p->next;
}
return head;
}
};
虚拟头指针:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//使用虚拟头结点
ListNode *dummy_head = new ListNode;
dummy_head->next = head;
ListNode *p = dummy_head;
while(p->next != nullptr)
{
if(p->next->val == val)
{
ListNode *temp = p->next;
p->next = p->next->next;
delete temp; //清理内存
}
else
p = p->next;
}
head = dummy_head->next;
delete dummy_head; //清理内存
return head;
}
};
Python代码:(Python省去了手动管理内存部分)
原链表删除元素:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
while head and head.val == val:
head = head.next
p = head
while p and p.next:
if p.next.val == val:
p.next = p.next.next
else:
p = p.next
return head
虚拟头指针:
class Solution:
def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
dummy_head = ListNode(next = head)
p = dummy_head
while p.next:
if p.next.val == val:
p.next = p.next.next
else:
p = p.next
head = dummy_head.next
return head