class MyLinkedList {
public:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) :val(x), next(NULL) {}
};
ListNode *head;
MyLinkedList() {
head = NULL;
}
int get(int index) {
if (index < 0 || head == NULL)return -1;
ListNode *p = head;
int j = 0;
while (p->next != NULL && j < index) {
p = p->next;
j++;
}
if (j == index) {
return p->val;
}
else if (j != index) {
return -1;
}
return 0;
}
void addAtHead(int val) {
if (head == NULL) {
head = new ListNode(val);
}
else {
ListNode *p = new ListNode(val);
p->next = head;
head = p;
}
}
void addAtTail(int val) {
if (head == NULL) {
head = new ListNode(val);
}
else {
ListNode *p = head;
while (p->next!=NULL) {
p = p->next;
}
p->next = new ListNode(val);
}
}
void addAtIndex(int index, int val) {
if (index < 0)return;
if (head == NULL) {
if (index > 0) {
return;
}
else {
head = new ListNode(val);
return;
}
}
ListNode* p = head;
ListNode *last = NULL;
int j = 0;
while (p->next != NULL && j < index) {
last = p;
p = p->next;
j++;
}
if (j == index) {
if (index == 0) {
ListNode *q = new ListNode(val);
q->next = head;
head = q;
}
else {
ListNode *q = new ListNode(val);
q->next = p;
last->next = q;
}
}
else if (j == index - 1) {
p->next = new ListNode(val);
}
}
void deleteAtIndex(int index) {
if (index < 0 || head == NULL)return;
ListNode *p = head;
ListNode *last = NULL;
int j = 0;
while (p->next != NULL && j < index) {
last = p;
p = p->next;
j++;
}
if (j == index) {
if (j == 0) {
delete head;
head = NULL;
}
else {
last->next = p->next;
delete p;
}
}
}
};