凡科网站建设视频,陕西最新消息,营销型网站软件,网站建设的方案预算对于初学链表的学者来学#xff0c;链表是比较困难的#xff0c;这部分对指针结构体的要求比较高。我们通过练习是掌握知识的重要途经203. 移除链表元素 - 力扣#xff08;LeetCode#xff09;我们在数组中去除某元素是遍历一遍数组#xff0c;如果某位置是要去除的元素链表是比较困难的这部分对指针结构体的要求比较高。我们通过练习是掌握知识的重要途经203. 移除链表元素 - 力扣LeetCode我们在数组中去除某元素是遍历一遍数组如果某位置是要去除的元素就将后面的元素挪过来覆盖了我们要去除的元素。这样的效率是不是特别的慢假如每个元素都是要去除的时间复杂度为O(N^2)在链表中我们知道数据是存储在不连续的空间的一个数据内有下一个元素的地址我们移除链表的数据只要改变前一个数据内存储的指向我们要移除的数据的地址.我们还可以将不是val的值全部存储到一个新的结构体指针内然后将新开辟的结构体指针返回即可代码写到这样整体逻辑是没有问题的但是细节我们处理到位所以导致我们无法运行出来。看我们的报错不能通过的用例是[1,2,6,3,4,5,6]什么原因导致的因为可能全部都是要删除的元素所以我们的tail也可能为空指针当tail不为空的时候我们tail的nextstruct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* newnode NULL;struct ListNode* tail NULL;struct ListNode* cur head;while(cur){if(cur-val!val){if(tailNULL){tailnewnodecur;}else{tail-nextcur;tailtail-next;}curcur-next;}else{struct ListNode* retcur-next;free(cur);curret;}}if(tail!NULL)tail-nextNULL;return newnode;}这个题也可以通过双指针来进行操作struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* prevNULL;struct ListNode* curhead;while(cur){if(cur-val!val){prevcur;curcur-next;}else{if(prevNULL){headcur-next;free(cur);curhead;}else{prev-nextcur-next;free(cur);curprev-next;}}}return head;}双指针解决问题的时候大家要注意头删的时候操作和后面的删除操作是不相同的头删后我们头的位置发生变化