题目链接:707.设计链表
注意
struct MyListNode {
int val;
struct MyListNode * next;
};
class MyLinkedList {
private:
struct MyListNode * head;
struct MyListNode * tail;
int size;
...
对于这种写法,有以下几个注意的点
- addAtHead时,如果链表为空,记得更新tail
- addAtIndex时,如果链表为空,Index = 0,记得更新tail
- deleteAtIndex,删除最后一个节点时,记得更新tail
代码
struct MyListNode {
int val;
struct MyListNode * next;
};
class MyLinkedList {
private:
struct MyListNode * head;
struct MyListNode * tail;
int size;
public:
MyLinkedList() {
head = new MyListNode;
tail = head;
head->val = 0;
this->size = 0;
head->next = nullptr;
}
int get(int index) {
if (index >= size || index < 0) return -1;
MyListNode * cur = head->next;
for (int i = 0; i < index; ++i) cur = cur->next;
return cur->val;
}
void addAtHead(int val) {
MyListNode * temp = new MyListNode;
temp->val = val;
temp->next = head->next;
head->next = temp;
if (tail == head) tail = temp;
this->size++;
}
void addAtTail(int val) {
MyListNode * temp = new MyListNode;
temp->val = val;
temp->next = nullptr;
tail->next = temp;
tail = temp;
this->size++;
}
void addAtIndex(int index, int val) {
if (index > size || index < 0) return;
MyListNode * pre = head;
for (int i = 0; i < index; ++i) pre = pre->next;
MyListNode * temp = new MyListNode;
temp->next = pre->next;
if (temp->next == nullptr) tail = temp;
temp->val = val;
pre->next = temp;
this->size++;
}
void deleteAtIndex(int index) {
if (index >= size || index < 0) return;
MyListNode * pre = head;
for (int i = 0; i < index; ++i) pre = pre->next;
MyListNode * temp = pre->next;
if (temp == tail) tail = pre;
pre->next = temp->next;
delete temp;
this->size--;
}
};
/**
* 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);
*/
``