题目:移除链表元素
代码随想录链接:代码随想录 (programmercarl.com)
方法一:考虑两种情况
1、非头结点的删除: 当前指针直接指向下下一个节点
2、头节点的删除:头结点向后移动一位
注意:C++要删除原来的节点释放内存
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//一个链表为什么有这么多头结点?理解:只有一个头结点,如果它被删掉了下一个就是头结点
// 删除头结点
while(head != NULL && head->val == val){
ListNode* now=head;
head=head->next;
delete now;
}
ListNode* cur = head;
// 删除非头结点
while(cur != NULL && cur->next != NULL){
if(cur->next->val == val){
ListNode* now=cur->next;
cur->next = cur->next->next;
delete now;
}else{
cur = cur->next;
}
}
return head;
}
};
cur和head指向的是同一个内存地址,当cur发生变化时,head对应地址里的东西也会变化,所以可以直接返回head。
方法2:使用虚拟头结点(dummy node),也就是在原来的头结点前添加一个头结点
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
// 设置一个虚拟头结点
ListNode* dummynode = new ListNode(0);
// 指向head
dummynode->next = head;
ListNode* cur = dummynode;
// while(cur != NULL && cur->next !=NULL){ //这里不用判断自己是否空,因为dummynode是我们自己定义的,可以确定不为空
while(cur->next != NULL){
if(cur->next->val == val){
ListNode* temp = cur->next;
cur->next = cur->next->next;
delete temp;
}
else{
cur = cur->next;
}
}
head = dummynode->next;
delete dummynode;
return head;
}
};