跟随代码随想录刷题,今日只是学习链表的各种操作。
教训:①老老实实解题,自己设想的各种情况不切实际不要搞。
②注意是下标还是位置。此题给的是下标。
代码:
class MyLinkedList {
public:
struct LinkedNode {
int val;
LinkedNode* next;
LinkedNode(int data) : val(data), next(NULL){};
};
LinkedNode* _virHead = new LinkedNode(0);
int _size = 0;
MyLinkedList() {
LinkedNode* _virHead = new LinkedNode(0);
int _size = 0;
}
int get(int index) {
// 还要考虑到index是否是非法数值
if (index < 0 || index > _size) {
return -1;
}
int number = 0;
// 如果虚拟头节点的下一个位置不是空,且要获取的是第一个真实头节点的值
LinkedNode* cur = _virHead->next;
while (cur != NULL) {
if (number == index) {
return cur->val;
}
cur = cur->next;
number += 1;
}
// 如果第一个就是空的,那直接返回-1。
return -1;
}
void addAtHead(int val) {
LinkedNode* newNode = new LinkedNode(val);
newNode->next = _virHead->next;
_virHead->next = newNode;
_size++;
}
void addAtTail(int val) {
LinkedNode* newNode = new LinkedNode(val);
LinkedNode* cur = _virHead;
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = newNode;
newNode->next = NULL;
// cur = newNode;
_size += 1;
}
void addAtIndex(int index, int val) {
LinkedNode* newNode = new LinkedNode(val);
if (index < 0 || index > _size) {
return;
// newNode->next = _virHead->next;
// _virHead->next = newNode;
// _size += 1;
} else if (index == _size) {
// 如果输入的索引值>或=链表长度,则在末尾添加
// 在尾部插入
LinkedNode* temp = _virHead;
while (temp->next != NULL) {
temp = temp->next;
}
newNode->next = NULL;
temp->next = newNode;
_size += 1;
// gpt说我这一步是多此一举。
// delete temp;
} else {
// 如果不是这两种极端值,就是正常的在其中插入了
int number = 0;
LinkedNode* cur = _virHead;
while (index != number) {
number += 1;
cur = cur->next;
}
newNode->next = cur->next;
cur->next = newNode;
_size += 1;
}
}
void deleteAtIndex(int index) {
LinkedNode* cur = _virHead;
if (index < 0 || index > _size || index == _size) {
return;
} else {
int number = 0;
while (number != index) {
number += 1;
cur = cur->next;
}
LinkedNode* tempNode = cur->next;
cur->next = cur->next->next;
_size -= 1;
tempNode->next = NULL;
delete tempNode;
}
}
};