前言:致力于转行的在读建筑硕士,在代码随想录及csdn见证自己在c语言道路上的成长,每一道题目尽可能通过一下顺序:自我编写-问题分析-学习代码-改进方案-知识总结~
题目:力扣203 移除链表元素
https://leetcode.cn/problems/remove-linked-list-elements/
方法二:设置虚拟头节点
一、独立解题
1.1 解题思路
1)创建一个虚拟头节点new_head,并为其通过malloc分配内存
2)将new_head的next节点指向head节点
3)创建指示指针cur指向new_head
4) 通过循环判别当前节点值是否val,如果是,将指针指向下下个节点;如果不是,将指针指向下一个节点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode* new_head;
new_head = (struct ListNode*)malloc(sizeof(struct ListNode));
new_head -> next = head;
struct ListNode* cur = new_head;
while(cur->next){
if(cur->next->val == val){
struct ListNode* tmp = cur->next;
cur->next = cur->next->next;
free(tmp);
}else{
cur = cur->next;
}
}
head = new_head->next;
return head;
}
1.2 要点记录
1)创建虚拟头节点要分配内存
2)最后要将头节点指向new_head->next,然后再返回head
3)定义指针之后就要给它一个指向,不可以写成下面代码:
二、学习过程
2.1参考答案
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
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;
}
2.2 对比反思
1) 可以通过typedef来简化结构体变量的定义
2)释放虚拟头节点
三、总结反思
3.1代码修改
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode* new_head;
new_head = (struct ListNode*)malloc(sizeof(struct ListNode));
new_head -> next = head;
struct ListNode* cur = new_head;
while(cur->next){
if(cur->next->val == val){
struct ListNode* tmp = cur->next;
cur->next = cur->next->next;
free(tmp);
}else{
cur = cur->next;
}
}
head = new_head->next;
free(new_head);
return head;
}
3.2 细节总结
1) 进行循环条件判断时,只需要判断下一个节点是否存在,并不需要判断当前节点是否存在,因为如果head为NULL,直接返回NULL
后记:“成为那种不声不响,但什么都做的很好的人!” --406工位