class MylinkedList {
public:
//定义链表节点结构体
struct linkedNode {
int val;
linkedNode* next;
linkedNode(int val):val(val), next(nullptr){}
};
// 初始化链表
MylinkedList() {
node = new linkedNode(0); // 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点
_size = 0;
}
//根据示例我们可以得出下标为0的是第一个数值
int get(int index) {
if(index > _size - 1 || index < 0){//链表数值范围[0,_size-1]
return -1;
}
linkedNode *temp = node->next;
while(index--){//这个index--,可以让我们知道指针往后移动的次数,直到为0找到为止
temp = temp->next;
}
return temp->val;
}
//插入一个新结点 为头节点
void addAtHead(int val) {
linkedNode*newNode = new linkedNode(val);
newNode->next = node->next;
node->next = newNode;
_size++;
}
//在尾部插入一个结点
void addAtTail(int val) {
linkedNode *newNode = new linkedNode(val);
linkedNode* temp = node;
while(temp->next != NULL){
temp = temp->next;
}
temp->next = newNode;
_size++;
}
//第一种情况:比如(1,2) 则在第二个元素的位置插入2
//如果index等于链表长度则在结尾插入一个值
//如果大于链表的长度则返回空
void addAtIndex(int index, int val) {
if(index > _size){
return;
}
linkedNode* newNode = new linkedNode(val);
linkedNode* temp = node;//第一个结点是虚拟结点
//比如 原来的链表为1->3 然后插入(1,2) 因为有虚拟结点的存在所以
//链表实际为(0->1->3) 所以当index为0的时候 temp 指向是链表中的1
while(index--){
temp = temp->next;
}
newNode->next = temp->next;
temp->next = newNode;
_size++;
}
void deleteAtIndex(int index) {
if(index < 0 || index > _size-1)//大于链表的长度
return ;
linkedNode* temp = node;
while(index--){
temp = temp->next;
}
//当结束while循环的时候 这时候的temp指向的是要删除结点的前一个结点
linkedNode *cmp = temp->next;//cmp指向了要删除的结点
temp->next = temp->next->next;
delete cmp;
_size--;
}
private:
int _size;
linkedNode * node;
};
渣渣杰又水了一道 ,这个是关于链表的增删查,得理解每个函数中的边界条件 其次多敲两遍 会熟练一些
晚安 陌生的你 最近开始睡前听播客了 感觉有一个人 一直在我耳边叨叨 排解孤独 还有助入睡 我在知乎上看一篇文章的时候 那篇文章 提到了 张爱玲的《倾城之恋》最近就靠他入睡了 晚安晚安 陌生人!!!



