移除链表元素
移动链表元素
这道题考查的就是链表的删除操作。
我的想法是用两个结点指针p、q分别指向正在比较的结点和该结点的前一个结点,以便删除时进行q->next = p->next
的操作。
但是我犯了一个错误,在对每个结点进行判断后,我都写上了q = p
的语句,如果这时p为要删除的结点,在我进行了q = p
的操作后,q指向被删除的结点,也就是这样:
这里记录两种写法:
1、使用原来的链表进行删除
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//先将头结点判断完毕
while(head != nullptr && head->val == val) {
ListNode *temp = head;
head = head->next;
delete temp;
}
ListNode* p = head;
while(p != nullptr && p->next != nullptr) { //后一句判断不可少
if(p->next->val == val) { //判断p->next,就不用再设置变量保留删除结点的前结点
ListNode* temp = p->next;
p->next = p->next->next;
delete temp;
}
else {
p = p->next;
}
}
return head;
}
};
2、设置虚拟头结点进行删除
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* NewHead = new ListNode(0); // 设置一个虚拟头结点
NewHead->next = head; // 将虚拟头结点指向head,这样免去了后面单独对删除头结点的操作
ListNode* p = NewHead;
while (p->next != NULL) {
if(p->next->val == val) {
ListNode* tmp = p->next;
p->next = p->next->next;
delete tmp;
} else {
p = p->next;
}
}
head = NewHead->next;
delete NewHead;
return head;
}
};