一.相关链接
题目链接:707.设计链表
二.心得体会
这道题也是一道链表题,使用虚拟头节点来处理。整体的逻辑都是很简单的,需要注意的是判断索引值是否合理的时候,需要注意按索引增加链表节点时要比get和delete多一位,即>len。
三.代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class MyLinkedList {
public:
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
int _len;
ListNode* _dummy_head;
MyLinkedList() {
_dummy_head = new ListNode(0);
_len = 0;
}
int get(int index) {
if(index<0||index>_len-1) return -1;
ListNode* p = _dummy_head;
for(int i=0;i<=index;i++){
p = p->next;
}
int ans = p->val;
return ans;
}
void addAtHead(int val) {
ListNode* p = new ListNode(val);
p->next = _dummy_head->next;
_dummy_head->next = p;
_len++;
return ;
}
void addAtTail(int val) {
ListNode* p = _dummy_head;
ListNode* tail = new ListNode(val);
for(int i=0;i<_len;i++){
p = p->next;
}
p->next = tail;
_len++;
return ;
}
void addAtIndex(int index, int val) {
if(index<0||index>_len) return;
ListNode* p = _dummy_head;
ListNode* index_node = new ListNode(val);
for(int i=0;i<index;i++){
p = p->next;
}
index_node->next = p->next;
p->next = index_node;
_len++;
return ;
}
void deleteAtIndex(int index) {
if(index<0||index>_len-1) return;
ListNode* p = _dummy_head;
for(int i=0;i<index;i++){
p = p->next;
}
ListNode* tmp = p->next;
p->next = tmp->next;
delete tmp;
_len--;
return ;
}
};
/**
* 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);
*/