移除链表元素
删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
思路:添加一个虚拟的头节点,这样即便原来的头节点是要删除的节点也可以和非头节点一样删除,移除链表的某个节点,需要知道当前节点的前一个节点,这样我们在遍历链表的时候,只需要看当前节点的下一个节点是否为待删除的节点即可,如果是则删除当前节点,继续判断当前节点的下一个节点是否为待删除的节点,因为我们每次都是看当前节点的下一个节点是否为待删除的节点,所以循环条件则是当前节点的下一个节点是否为空即可,为空说明所有的节点都判断完了,不为空则继续判断下一个节点
struct ListNode{
int val;
ListNode* next;
ListNode():val(0),next(nullptr){}
ListNode(int _val):val(_val),next(nullptr){}
};
ListNode* removeElements(ListNode* head, int val){
ListNode* pHead = new ListNode();
ListNode* pTmpHead = pHead;
pTmpHead->next = head;
while(pTmpHead->next){
ListNode* pNext = pTmpHead->next;
if(pNext->val == val){ //删除val节点
ListNode* pCur = pNext;
pTmp->next = pNext->next; //将当前节点的next连接到删除节点的下一个节点,但此时当前节点不后移,因为不知道删除节点的下一个节点是否需要删除
delete pCur;
}
else
pTmpHead = pTmpHead->next; //只有当pNext的节点不是要删除的节点时,才将当前节点后移
}
return pHead->next;
}