你可以选择使用单链表或者双链表,设计并实现自己的链表。
单链表中的节点应该具备两个属性: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
的节点。class MyLinkedList { public: // 定义链表节点结构体 struct LinkedNode { int val; LinkedNode* next; LinkedNode(int val):val(val), next(nullptr){} }; LinkedNode* _dummyHead; int _size; //构造函数 初始化 MyLinkedList() { _dummyHead = new LinkedNode(0); // 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点 _size = 0; } int get(int index) { //合法性判断 if(index<0||index>_size-1){ return -1; } LinkedNode* cur =_dummyHead->next; // 只要下标索引有效,就一直循环 while(index--){ cur = cur->next; } return cur->val; } void addAtHead(int val) { LinkedNode* newNode =new LinkedNode(val); newNode->next =_dummyHead->next; //指向头节点 _dummyHead->next =newNode; _size++; //长度+1 } void addAtTail(int val) { LinkedNode* newNode = new LinkedNode(val); //先要找到最后一个节点 LinkedNode* cur = _dummyHead; while(cur->next!=nullptr){ cur =cur->next; } cur->next = newNode; _size++; } void addAtIndex(int index, int val) { LinkedNode* newNode =new LinkedNode(val); if(index>_size){ return; } if(index<0){ index =0 ; } LinkedNode* cur =_dummyHead; while(index--){ cur = cur->next; } newNode->next =cur->next; cur->next =newNode; _size++; } void deleteAtIndex(int index) { //删除就是让cur 指向 下下个 if(index<0||index>_size-1){ return ; } LinkedNode* cur =_dummyHead; while(index--){ cur = cur->next; } LinkedNode* tem = cur->next; cur->next=cur->next->next; delete tem; //防止成为野指针 tem = nullptr; _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); */