整体没太多难度,主要是if-else结构写着写着就乱了,debug很久
使用虚拟头指针还是比较方便的;此外,涉及到对第几个元素操作,是否越界需要引入size
需要回忆:C++类的定义(public,private),C++内存机制(创建和delete)
class MyLinkedList {
public:
struct LinkList {
int val;
LinkList* next;
LinkList(int val) : val(val), next(nullptr) {} // 不记得了
};
MyLinkedList() {
dummyHead = new LinkList(0); // 还有默认初始化吗
size = 0;
}
int get(int index) {
if (index > size - 1 || index < 0) {
return -1;
}
LinkList* p = dummyHead->next; // 0,1,2,...,index
for (int i = 1; i <= index; i += 1) {
p = p->next;
}
return p->val;
}
void addAtHead(int val) {
LinkList* head = new LinkList(val);
head->next = dummyHead->next;
dummyHead->next = head;
size++;
}
void addAtTail(int val) {
LinkList* p = new LinkList(val);
LinkList* q = dummyHead;
while (q->next != nullptr) {
q = q->next; // 反了
}
q->next = p;
size++;
}
void addAtIndex(int index, int val) { // 0.index-1.cha.index,
if (index > size || index < 0) { // 添加对 index 的检查
return;
}
LinkList* p = new LinkList(val);
size++;
if (index == 0) {
p->next = dummyHead->next;
dummyHead->next = p;
} else {
LinkList* q = dummyHead; // 内存?
for (int i = 0; i <= index - 1; i++) {
q = q->next;
}
p->next = q->next;
q->next = p;
}
}
void deleteAtIndex(int index) {
if (index >= 0 && index <= size - 1) { //-1~index-1
LinkList* q = dummyHead; // 内存?
if (index == 0) {
LinkList* m = dummyHead->next;
dummyHead->next = dummyHead->next->next;
delete (m);
} else { //
for (int i = 0; i <= index - 1; i++) {
q = q->next;
}
LinkList* n = q->next;
q->next = q->next->next;
delete (n); // 删除的逻辑?!!!!!!!
}
size--;
}
}
private:
int size; // get(index)下标是否无效
LinkList* dummyHead;
};
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList* obj = new MyLinkedList();
* int param_1 = obj->get(index);
* obj->addAtHead(val);
* obj->addAtTail(val);
* obj->addAtIndex(index,val);
* obj->deleteAtIndex(index);
*/