思路
就是简单的链表实现,写的时候发现删除可以不用维护pre指针,记录一下代码。
代码
class MyLinkedList {
public:
struct Node {
int val;
Node* next;
Node() : val(0), next(nullptr) {}
Node(int val, Node* next) : val(val), next(next) {}
};
// 头节点
Node* head;
// 头节点不存储数据
MyLinkedList() {
this->head = new Node();
}
// 例如对于链表[1, 2, 3],get(1)返回2
int get(int index) {
Node* cur = head;
// 注意要>=,否则会停到目标节点的上一个
while (index-- >= 0) {
cur = cur->next;
if (cur == nullptr)
return -1;
}
return cur->val;
}
// 在头节点插入
void addAtHead(int val) {
Node* newHead = new Node(val, this->head->next);
this->head->next = newHead;
}
// 在尾节点插入
void addAtTail(int val) {
Node* cur = head;
while (cur->next != nullptr)
cur = cur->next;
Node* newTail = new Node(val, nullptr);
cur->next = newTail;
}
// 例如对于链表[1, 3],addAtIndex(1, 2)会得到[1, 2, 3]
// index<=0都插入到头节点
void addAtIndex(int index, int val) {
Node* cur = head;
// 注意这里和get()的区别,只需要>即可。
// 这样的话会在待插入位置的上一个节点停下,就不用再维护一个pre指针
while (index-- > 0) {
cur = cur->next;
if (cur == nullptr)
return;
}
Node* newOne = new Node(val, cur->next);
cur->next = newOne;
}
// 同上
void deleteAtIndex(int index) {
Node* cur = head;
// 同上,提前停下可以不用维护pre指针
while (index-- > 0) {
cur = cur->next;
if (cur->next == nullptr)
return;
}
// 此时cur到达要删除节点的前一个
Node* deleted = cur->next;
cur->next = deleted->next;
delete deleted;
}
};