707. 设计链表
题目中这个“假设链表中的所有结点都是0-index”的意思应该就是指索引从0开始。
设计链表本身难度不高,就是可能各种地方会出点错,反正你要保持链表的定义不变,例如我用的链表的定义就是有一个空的头结点,索引从0开始,空头结点不加入长度的计算,每次查找或其他操作的索引也是从0开始计算的。
struct NewListNode {
int val;
NewListNode* next;
NewListNode() : val(0), next(nullptr) {}
NewListNode(int x) : val(x), next(nullptr) {}
NewListNode(int x, NewListNode* next) : val(x), next(next) {}
};
class MyLinkedList {
private:
NewListNode* head;
int len;
public:
MyLinkedList() {
head = new NewListNode();
len = 0;
}
MyLinkedList(NewListNode* head) : head(head), len(0) {}
int get(int index) {
NewListNode* temp = head;
while (temp->next != nullptr) {
index--;
if (index < 0)
return temp->next->val;
temp = temp->next;
}
return -1;
}
void addAtHead(int val) {
NewListNode* temp = new NewListNode(val, head->next);
head->next = temp;
len++;
}
void addAtTail(int val) {
NewListNode* temp = head;
while (temp->next != nullptr) {temp = temp->next;}
NewListNode* newNode = new NewListNode(val);
temp->next = newNode;
len++;
}
void addAtIndex(int index, int val) {
// if (index == len)
// addAtTail(val);
// else if (index < 0)
// addAtHead(val);
// else if (index > len)
// return;
// else {
NewListNode* temp = head;
int newLen = len + 1;
while (newLen--) {
index--;
if (index < 0) {
NewListNode* newNode = new NewListNode(val, nullptr);
newNode->next = temp->next;
temp->next = newNode;
len++;
return;
}
temp = temp->next;
}
};
void deleteAtIndex(int index) {
NewListNode* temp = head;
while (temp->next != nullptr) {
index--;
if (index < 0) {
NewListNode* deleteNode = temp->next;
temp->next = temp->next->next;
delete deleteNode;
len--;
return;
}
temp = temp->next;
}
}
};
/**
* 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);
*/