七、203. 移除链表元素
思路
代码
第一种
//解法1.双指针(跳过并释放不符合的结点)
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode* cur = head;
struct ListNode* prev = NULL;
while(cur)
{
if(cur->val!=val)
{
prev = cur;
cur = cur->next;
}
else
{
if(prev==NULL)//如果第一个就相同,那么让head改变,不能改变prev,prev只是赋上了head的值,它的指向改变并不影响head的指向,后面不用这样是因为结构体指针可以改变结构体内部的内容。
{
head = head->next;
free(cur);
cur = head;//头指针变了,cur也要跟着变。
}
else
{
prev->next = cur->next;
free(cur);
cur = prev->next;
}
}
}
if(head!=NULL)//如果最后一个元素为val,那么释放后该链表最后指向的就会是被释放的空间,所以赋上NULL;
prev->next = NULL;
return head;
}
第二种
//解法2.创建一个新的链表(虽然还是指向这块链表,但是这次是让他们看作都没连接,让符合条件的重新串起来),然后将满足条件的尾插过去。其实可以看作第一种是两个指针在一个链表上操作,这个可以看作是两个指针都分别操纵一个链表,让符合条件的重新连接起来。
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode* cur, * tail, * newhead;
cur = head;
tail = newhead = NULL;
while (cur)
{
if (cur->val != val)
{
if (newhead == NULL)
{
newhead = tail = cur;
cur = cur->next;
}
else
{
tail->next = cur;
tail = cur;
cur = tail->next;
}
}
else
{
struct ListNode* next = cur->next;
free(cur);
cur = next;
}
}
if(tail)
tail->next = NULL;
return newhead;
}
- 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。