1.单链表节点
链表中的节点类型, 是一种结构体指针,
即 链表节点 本身就是 一个指针类型,
只不过是一种特殊类型的 结构体指针;
该结构体指针中{
- 自定义的数值;
- 指向下一个节点的结构体指针;
- 自定义的 节点构造函数, 方便于初始化化时,可以直接赋值;
}
struct ListNode{
int val; // 节点中的数值
struct* next; // 节点中指向下一个节点的指针, 该指针类型是结构体, 所以内存中 取字节时, 按照结构体的类型取字节;
// 节点的构造函数
ListNode(int x): val(x), next(nullstr){}
};
1.1 节点的表示
注意: 先理清各个节点 表示,所代表的含义;
1.2 移除节点
// 节点的创建, 代表的是一个链表中的节点;
ListNode* curNode ;
// 代表当前节点中数值;
curNode->val ;
// 节点中的指针, 存放的是下一个节点的地址;
curNode->next;
// 使用当前节点,表示出下一个节点中的数值 ;
curNode->next->val
class Solution{
public:
ListNode* removeNode( ListNode* head, int val){
// 创建一个虚拟头节点, 用于将虚拟头节点与 传过来的节点进行链接;
// 因为结构体 指针, 内部自定义了 节点的构造函数, 所以这里初始化节点时, 可以直接赋值;
ListNode* dummyHead = new ListNode(0);
// 将虚拟头节点中的指针 指向 传过来的头节点;
dummyHead->next = head;
// 使用一个结构体指针, 用来存储当前节点;
ListNode* curNode = dummyHead;
// curNode->next: 代表当前节点的下一个节点, curNode->next->val 当前节点下一个节点中的数值;
while(curNode->next != nullptr){ // 当下一个节点不为空时, 遍历链表
if(curNode->next->val == val ){ // 当数值相同时, 表明当前节点的下一个节点是 待删除的节点;
ListNode* tmp = curNode->next; // 将 待删除的节点保存下来;
curNode->next = curNode->next->next; // 将当前节点中的指针 赋值为 当前节点的下一个后,再下一个节点;
delete tmp; // 删除该节点, 释放出内存空间地址;
} else{
curNode = curNode->next;
}
}
head = dummyHead->next;
delete dummyHead;
return head;
}
};