题意:删除链表中等于给定值 val 的所有节点。
示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2: 输入:head = [], val = 1 输出:[]
示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]
思路1:直接使用原来的链表来进行删除操作
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//删除头节点(头结点不为空,且他的值也等于要删除的值)
while (head != NULL && head->val == val) {
//将头结点的指针赋值给一个临时变量:
ListNode* temp = head;
//头结点指向他的下一个
head = head->next;
//删除之前的头结点:
delete temp;
}
//删除非头节点;
ListNode* cur = head;
//头结点不为空,且他的next也不为空:
while (cur != NULL && cur->next != NULL) {
if (cur->next->val == val) {
//将要删除的节点赋值给一个临时变量;
ListNode* temp = cur->next;
cur->next = cur->next->next;
//释放刚才要删除的那个结点(即cur->next已被删除)
delete temp;
}
else {
cur = cur->next;
}
}
return head;
}
};
思路2:设置一个虚拟头结点在进行操作
class Solution{
public:
ListNode* removeElement(ListNode * head,int val) {
ListNode * dummyHead = new ListNode(0);//设置一个虚拟头节点:
dummyHead->next = head;//将虚拟头结点指向head,即将虚拟头结点和真实头结点连接起来;
ListNode* current = dummyHead;
while(current->next!=NULL){//主要current的next不为空,就一直往下走,即遍历所有元素:
if (current->next->val == val) {//如果遇到与val相同的值,就移除
ListNode* temp = current->next;
current->next = current->next->next;
delete temp;
}
else {//如果没遇到,就更新current的值,继续往下走,这一步做的是更新while循环的迭代条件;
current = current->next;
}
}
//返回时,返回真正的头结点;
head = dummyHead->next;
//然后删除虚拟头结点;
delete dummyHead;
//返回真实的头结点;
return head;
}
};