【力扣】-- 移除链表元素
题目要求
给你一个链表的头节点
head
和一个整数val
,请你删除链表中所有满足Node.val == val
的节点,并返回 新的头节点 。
示例
解法一:双指针
思路
创建两个指针 pcur 和 prev , pcur=head, prev为空指针,使用while语句 pcur 遍历链表,有以下三种情况👇,最后返回新的节点head
图解
①pcur = val且是phead=val
②链表中元素 != val
③(除首元素之外的元素)其他元素=val
代码
typedef struct ListNode LTNode; struct ListNode* removeElements(struct ListNode* head, int val) { LTNode* prev = NULL,*pcur = head; while(pcur) { //首元素=val if(pcur->val == val) { if(pcur == head) { head = pcur->next; free(pcur); pcur = head; } //其他元素=val else { prev->next =pcur->next; free(pcur); pcur = prev->next; } } //链表元素 != val else { prev = pcur; pcur = pcur->next; } } return head; }
解法二:尾插不是val的元素到新链表
思路
新创建两个指针 newhead 和 newtail, 并初始化为NULL;
在while循环下用pcur遍历原链表
在pcur->val!=val的情况下
①newhead != NULL
②newhead==NULL
如下图👇
最后结尾newtail的下一个节点置为空
图解
代码
typedef struct ListNode LTNode; struct ListNode* removeElements(struct ListNode* head, int val) { LTNode* newhead,*newtail; newhead = newtail = NULL; LTNode* pcur = head; while(pcur) { if(pcur->val != val) { if(newhead == NULL) { newhead = newtail = pcur; } else { newtail->next = pcur; newtail = newtail->next; } } pcur = pcur->next; } if(newtail) { newtail->next = NULL; } return newhead; }