链表的题目经常用到双指针,这个技巧要把握。
欢迎关注微信公众号:【没伞的孩子拼命跑】 和我的小伙伴们一块打卡吧!!!
题目要求:
题目解析
题目还是很容易理解,就是给你一个链表,删除链表中所有值等于val的节点。但是会有比较特殊的测试案例需要想到。比如是不是空链表,所有的值会不会都是val,开头和结尾的值如果是val怎么处理等等。
解题思路
链表的题目大部分都是用双指针,当然解法有很多,双指针是一个比较平常的思路,就是上来就要这样想,这样想做不出来再换思路。当然这个题目比较简单,方法也比较多,大家可以用自己擅长的。我用的是双指针,pre指针指向前一个节点,cur指针指向当前节点,然后再判断。
AC代码
//C++题解
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if (head == nullptr)return nullptr;
ListNode *cur = head;//当前节点
ListNode *pre = new ListNode(0);//新建一个节点
ListNode *h = pre;
while(cur!=nullptr)//到没到链表尾部
{
if(cur->val == val)//满足条件当前节点向后移动,跨过要删除的节点
{
cur = cur->next;
}
else //不满足条件,将前一个节点指向当前节点,并将pre赋为cur,cur继续向后
{
pre->next = cur;
pre =cur;
cur = cur->next;
}
}
pre->next = nullptr;//next指针置为空
return h->next;
}
};
通过情况