(写给未来遗忘的自己)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
// 因为除了第一个其他的都有指针指向的,但是第一个没有。所以删除第一个需要单独处理
while(head!=NULL&&head->val==val){
ListNode* delete_listnode=head;
head=head->next;
delete delete_listnode;
}
//因为后期需要返回的是一个链表头 所以需要将头保留下来 head
//利用新的一个指针move_listnode作为遍历的循环方式
ListNode* move_listnode=head;
while(move_listnode != NULL&&move_listnode->next!=NULL)
{
if(move_listnode->next->val==val){
ListNode *delete_1=move_listnode->next;
move_listnode->next=move_listnode->next->next;
delete delete_1;
}else{
move_listnode=move_listnode->next;
}
}
return head;
}
};
注意:
1.listnode的结构体的书写方式:
内部包含一个构造函数来初始化一个。
struct listNode{
int val;
listNode *next;
listNode(int x):val(x),next(NULL){};
};
2. C++中的链表删除元素后断开next的链接就是完成了,但是需要进行delete删除操作,避免内存的泄露。
3. next指向的是listNode类型的数据,也就是整个下一个链表的地址。
4.第一次提交错误的原因是 else里面的内容写在了外面 导致如果连续两个需要移除就报错,所以注意细节,细节决定成败!!!