/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {
if(head==NULL)
return head;
ListNode *NewHead,*NewTail;
ListNode *pcur=head;
NewHead=NewTail=(ListNode*)malloc(sizeof(ListNode));
if(NewHead==NULL)
{
return 1;
}
while(pcur)
{
if(pcur->val!=val)
{
NewTail->next=pcur;
NewTail=NewTail->next;
}
pcur=pcur->next;
}
if(NewTail)
NewTail->next=NULL;
ListNode *oj=NewHead;
NewHead=NewHead->next;
return NewHead;
}
代码解读:
1.节点的取值范围为0-10^4,如果head一开始就是NULL,那么直接返回head.
2.再while循环中,我们申请了一块空间,作为头节点,这就是带头的单向链表了,这么做的目的是,我们可以在while循环中,不用去判空,即不用去判断NewHead和NewTail为NULL。避免如果要多次判空带来的重复代码。
3.我们不知道NewTail里的next指针是不是为空,那么我们就应该去把NewTail->next=NULL,防止他指向其他结点。
4.我们申请的动态空间要主动去释放,避免内存泄漏。但是我们要先保存NewHead->next,因为如果我们先释放头结点,我们就不能找到下一节点。