😶🌫️😶🌫️😶🌫️😶🌫️Take your time ! 😶🌫️😶🌫️😶🌫️😶🌫️
💥个人主页:🔥🔥🔥大魔王🔥🔥🔥
💥所属专栏:🔥魔王的修炼之路–数据结构🔥
如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的点赞👍和关注💖,支持一下博主。同时记得收藏✨这篇文章,方便以后重新阅读。
七、203. 移除链表元素
203. 移除链表元素
思路
第一种方法:在当前链表上修改,如果不符合题意,就把不符合题意的这个元素的前一个指向的地址变成这个不符合题意之后的元素,然后释放这个不符合题意的。如果符合题意,那就都指向自己指向的结构体的next,也就是不改变符合条件的结点,只跳过并释放不符合条件的结点。
第二种方法:新建一个链表指向单链表的head,然后在原指针上用一个指针依次判断,如果不符合就跳过,如果符合就让新链表指向的结构体指向的next赋上这个指针,然后新链表指向新赋上的指针,并且原指针也指向原指针指向的下一个结点。
代码
第一种
//解法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;
}
- 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。
🌈专栏推荐
😈魔王的修炼之路–C语言
😈魔王的修炼之路–数据结构初阶
😈魔王的修炼之路–C++
😈魔王的修炼之路–Linux
更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。