企业网站个人可以备案吗,网站服务器维护内容,兰州再次出台9条优化措施,深圳龙华区邮政编码多少题目#xff1a;移除链表元素 两种实现思路
思路一
使用双指针#xff0c;prev#xff0c;cur快慢指针解决。当cur不等于val#xff0c;两个指针跳过。当等于val时#xff0c;要考虑两种情况#xff0c;一种是pos删#xff0c;一种是头删除。
pos删除就是正常情况移除链表元素 两种实现思路
思路一
使用双指针prevcur快慢指针解决。当cur不等于val两个指针跳过。当等于val时要考虑两种情况一种是pos删一种是头删除。
pos删除就是正常情况但头删是一种特殊情况比如第一个数据就是等于val。所以我们在这里分类处理。 struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* curhead,*prevNULL;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;
}
思路二
尾插到新链表如果不等于val尾插到新链表。如果等于val,那就头删。末尾记得把tail的next置空否则如果最后一个数据要删除的话那tail的next就成了野指针。还有两种特殊情况空链表和全等于val。
空链表
tail等于空指针如果末尾在使用就是空指针引用。
全等于val
这时全部头删没有一个结点尾插。那tail还是空指针末尾使用就是空指针引用。
这两种情况都是空指针引用错误。所以我们可以在末尾加一个if语句判断tail是否为空。
如果为空就不执行。如果不为空那就执行。
最后记得return的是新的头指针newHead。
struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* newHeadNULL,*tailNULL;struct ListNode* curhead;while(cur){if(cur-val ! val){if(tailNULL){newHeadtailcur;}else{tail-nextcur;tailcur;}curcur-next;}else{struct ListNode* nextcur-next;free(cur);curnext;}}if(tail){tail-nextNULL;}return newHead;
}
题目链接203. 移除链表元素 - 力扣LeetCode