基础知识:
1、与数组不同链表内存不是连续的,其通过各个指针来连接内存中的节点。
链表节点的定义:
单链表
struct ListNode{
int val; 节点上存储的元素
ListNode *next; 指向下一个节点的指针
ListNode(int x) : val(x), next(NULL) {} 节点的构造函数
};
不定义构造函数也可以,但是不会初始化成员变量
比较:
【使用自己定义的构造函数的话,初始化节点方式如下:】
ListNode* head = new ListNode(5);
【使用默认构造函数的话,初始化节点的方式如下:】
ListNode* head = new ListNode();
head -> val = 5;
移除链表元素两种方案:
1、直接使用原链表来进行移除节点操作
2、设置一个虚拟头节点再进行移除节点操作
1、
题意:删除链表中等于给定值 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
输出:[]
class Solution{
public:
ListNode* removeElements(ListNode* head,int val){
删除头节点
while(head != NULL && head->val == val){ 头节点非空并且头部的值是val
ListNode* tmp = head;
head = head->next;
delete tmp;
}
删除非头节点
ListNode* cur = head;
while(cur != NULL && cur -> next != NULL){
if(cur -> next -> val == val){
ListNode* tmp = cur -> next;
cur -> next = cur -> next -> next;
delete tmp;
}else{
cur = cur -> next;
}
}
return head;
}
}
2、
class Solution{
public:
ListNode* removeElements(ListNode* head,int val){
ListNode* dummyHead = new ListNode(0); 设置一个虚拟头节点
dummyHead -> next = head; 将虚拟头节点指向head
ListNode* cur = dummyHead;
while(cur -> next != NULL){
if(cur -> next -> val == val){
ListNode* tmp = cur -> next;
cur -> next = cur ->next -> next;
delete tmp;
}else{
cur = cur -> next;
}
}
head = dummyHead -> next;
delete dummyHead;
return head;
};
}