序:不论是自定义创建一个链表,还是对这个链表做操作,虚拟头节点绝对是一个好东西。
一、创建一个自定义的单链表
struct LinkNode
{
int val;
LinkNode *next;
LinkNode() : val(0), next(nullptr) {}
LinkNode(int x) : val(x), next(nullptr) {}
LinkNode(int x, LinkNode *next) : val(x), next(next) {}
};
class MyLinkedList
{
public:
int _size = 0;
LinkNode _dummyHead;
MyLinkedList(){
int _size = 0;
_dummyHead = LinkNode();
}
~MyLinkedList(){
LinkNode *cur = &_dummyHead;
while(cur->next != nullptr){
LinkNode *tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}
// delete cur;
}
void addAtHead(int val) {
LinkNode *newHead = new LinkNode(val);
LinkNode *cur = &_dummyHead;
newHead->next = cur->next;
cur->next = newHead;
_size++;
}
void GenerateList(int n)
{
for(int i = n; i > 0; i--){
addAtHead(i);
}
}
void ShowListNode()
{
LinkNode *cur = &_dummyHead;
while(cur->next != nullptr){
cout << cur->next->val << "\t";
cur = cur->next;
}
// delete cur;
}
};
二、一个栗子:移除链表元素
给你一个链表的头节点 head
和一个整数 val
,删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
举个栗子: