leetcode 707.设计链表
注意:
- 面向对象的思想 这是创建一个自己的链表,_dummyhead和_size初始化都在构造函数中,同时自己的链表类也需要定义自己的节点 struct LinkNode
- 链表的所有节点下表从0开始,即index从0开始,注意index和size的关系,index最大==size-1,同数组遍历的时候。
并且注意初始化cur的时cur=_dummyhead和cur=_dummyhead->next在遍历index次之后cur的位置和cur->next指向的是哪里(将_dummyhead当作index=-1的节点)
/*你可以选择使用单链表或者双链表,设计并实现自己的链表。
单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。
如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。
实现 MyLinkedList 类:
MyLinkedList() 初始化 MyLinkedList 对象。
int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/design-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。*/
class MyLinkedList {
public:
struct LinkedNode{
int val;
LinkedNode* next;
LinkedNode(int val):val(val),next(nullptr){};
};
MyLinkedList() {
_dummyhead=new LinkedNode(0);
_size=0;
}
int get(int index) {
if (index > (_size - 1) || index < 0) {//>=size也行
return -1;
}
LinkedNode* cur = _dummyhead;
while(index--){ // 如果--index 就会陷入死循环
cur = cur->next;
}
return cur->next->val;
}
void addAtHead(int val) {
LinkedNode* newNode=new LinkedNode(val);
newNode->next=_dummyhead->next;
_dummyhead->next=newNode;
_size++;
}
void addAtTail(int val) {
LinkedNode* cur=_dummyhead;
while(cur->next!=NULL){
cur=cur->next;
}
LinkedNode* newNode=new LinkedNode(val);
cur->next=newNode;
_size++;
}
void addAtIndex(int index, int val) {
if(index>_size) return ;
if(index<0) index=0;
LinkedNode* cur=_dummyhead;
while(index--){
cur=cur->next;
}
LinkedNode* newNode=new LinkedNode(val);
newNode->next=cur->next;//这步特别注意,新的节点是插入到第index之前成为第index节点,因此要将它插入到index-1的后面,如果是cur->next-next的话插完之后就会变成第index+1节点
cur->next=newNode;
_size++;
}
void deleteAtIndex(int index) {
if(index<0||index>=_size) return;
LinkedNode* cur=_dummyhead;
while(index--){
cur=cur->next;
}
LinkedNode* temp=cur->next;
cur->next=cur->next->next;
delete temp;
_size--;
}
private:
LinkedNode* _dummyhead;
int _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);
*/