#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode() : val(0), next(nullptr) {}
ListNode(int _val) : val(_val), next(nullptr) {}
ListNode(int _val, ListNode* _next) : val(_val), next(_next) {}
};
class MyLinkedList {
private:
ListNode* head;
ListNode* start;
ListNode* end;
int size;
public:
MyLinkedList() {
head = new ListNode(); // 初始化时,head没有指向任何节点,故start,end都指向NULL
start = NULL;
end = NULL;
size = 0;
}
int get(int index) {
ListNode* p = head;
int i=-1; // 由于增加了头节点,故从索引-1开始
if ((index >= size) || (index < 0) ) return -1;
while(true) {
if (i != index) {
p = p->next;
++i;
} else {
break;
}
}
return p->val;
}
void addAtHead(int val) {
ListNode* p1 = new ListNode(val);
if (size == 0) { // 将第一次加入节点拿出来单独处理
start = p1;
end = p1;
head->next = p1;
++size;
return ;
}
p1->next = start;
start = p1;
head->next = start;
++size;
}
void addAtTail(int val) {
ListNode* p2 = new ListNode(val);
if (size == 0) { // 将第一次加入节点拿出来单独处理
start = p2;
end = p2;
head->next = p2;
++size;
return ;
}
end->next = p2;
end = p2;
++size;
}
void addAtIndex(int index, int val) {
if (index > size) return ; // 当要插入的点大于size时,不插入节点
ListNode* p = head;
ListNode* t = new ListNode(val);
int i=-1; // 由于增加了头节点,故从索引-1开始
if (index <= 0) {
t->next = head->next;
head->next = t;
start = head->next;
++size;
return ;
}
if (index == size) {
end->next = t;
end = t;
++size;
return ;
}
while(true) { // 找到索引位置
if (i > size) {
return ;
} else if (i != (index-1)) { // 只找到i位置的前一个就行了。
p = p->next;
++i;
} else { // 找到了索引对应位置的前一个位置
break;
}
}
t->next = p->next;
p->next = t;
++size;
}
void deleteAtIndex(int index) {
if (index >= size) return ;
if (index < 0) return ;
ListNode* p = head;
ListNode* t = NULL;
int i=-1; // 由于增加了头节点,故从索引-1开始
if (index == 0) { // 如果删除0节点
t = head->next;
head->next = head->next->next;
start = head->next;
// delete t; 会报heap-use-after-free错误
--size;
return ;
}
while(true) { // 找到索引位置
if (i >= size) {
return ;
} else if (i != (index-1)) { // 只找到i位置的前一个就行了。
p = p->next;
++i;
} else { // 找到了索引对应位置的前一个位置
break;
}
}
if (index == (size-1)) {
t = p->next;
p->next = NULL;
end = p;
--size;
return ;
}
t = p->next;
p->next = p->next->next;
// delete t;
--size;
}
void showListTable() {
ListNode* p = start;
while(true) {
if (p->next != NULL) {
cout << p->val << "\t";
p = p->next;
} else {
break;
}
}
cout << p->val << endl;
}
};
int main() {
MyLinkedList* obj = new MyLinkedList();
obj->addAtHead(5);
obj->addAtHead(4);
obj->addAtHead(3);
obj->showListTable();
obj->addAtIndex(3, 0);
obj->deleteAtIndex(2);
obj->showListTable();
obj->addAtHead(66);
obj->showListTable();
obj->addAtTail(6);
obj->addAtTail(7);
obj->addAtTail(8);
obj->showListTable();
obj->addAtTail(9);
obj->addAtTail(10);
obj->addAtTail(11);
obj->addAtTail(12);
cout << "---test showListTable()--- " << endl;
obj->showListTable();
cout << "---test get(1)---" << endl;
cout << obj->get(1) << endl;
cout << "---test addAtIndex(5, 20)---" << endl;
obj->addAtIndex(5,20);
obj->showListTable();
cout << "---test deleteAtIndex(2)---" << endl;
obj->deleteAtIndex(2);
obj->showListTable();
return 0;
}
结果: