使用C语言代码求解Leetcode 203题练习链表时出现,代码如下
struct ListNode* removeElements(struct ListNode* head, int val) {
typedef struct ListNode ListNode;
ListNode* pummyHead;
pummyHead = (ListNode*)malloc(sizeof(ListNode));
pummyHead->next = head;
ListNode* cur = pummyHead;
while (cur->next != NULL) {
ListNode* temp = cur->next;
if (temp->val == val) {
cur->next = temp->next;
}
cur = cur->next;
}
head = pummyHead->next;
free(pummyHead);
return head;
}
因为第一次用C语言写链表,有些不熟,参考代码随想录中的代码如下:
struct ListNode* removeElements(struct ListNode* head, int val){
typedef struct ListNode ListNode;
ListNode *shead;
shead = (ListNode *)malloc(sizeof(ListNode));
shead->next = head;
ListNode *cur = shead;
while(cur->next != NULL){
if (cur->next->val == val){
ListNode *tmp = cur->next;
cur->next = cur->next->next;
free(tmp);
}
else{
cur = cur->next;
}
}
head = shead->next;
free(shead);
return head;
}
经过仔细对比发现我们的代码中缺少了关键的cur本身非空的判断,因为随想录中的代码是cur下一个节点满足条件,则cur转为指向下一个节点的下一个节点,否则cur跳转到下一个节点;
而我们的是如果下一个节点满足条件,就跳转到下一个节点的下一个节点,如果不满足则跳向下一个节点,有下一个节点为空的风险
另外随想录的方法还对满足条件的节点做了空间释放,值得学习