代码解决
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) {return -1;}LinkedNode*node=dummyhead->next;while(index){node=node->next;index--;}return node->val;}void addAtHead(int val) {LinkedNode*node=new LinkedNode(val);node->next=dummyhead->next;dummyhead->next=node;size++;}void addAtTail(int val) {LinkedNode*node=new LinkedNode(val);LinkedNode*cur=dummyhead;while(cur->next!=nullptr){cur=cur->next;}node->next=cur->next;cur->next=node;size++;}void addAtIndex(int index, int val) {if(index > size) return;if(index < 0) index = 0; LinkedNode* newNode = new LinkedNode(val);LinkedNode* cur = dummyhead;while(index){cur=cur->next;index--;}newNode->next=cur->next;cur->next=newNode;size++;}void deleteAtIndex(int index) {if (index >= size || index < 0) {return;}LinkedNode* newNode = dummyhead;LinkedNode* cur = dummyhead;while(index){cur=cur->next;index--;}LinkedNode* tmp = cur->next;cur->next = cur->next->next;delete tmp;tmp=nullptr;size--;}
private:int size;LinkedNode* dummyhead;};/*** 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);*/
实现思路
当创建一个
MyLinkedList
对象时,它会初始化一个虚拟头节点dummyhead
,并将链表的大小size
初始化为 0。链表的每个节点都包含一个整数值val
和一个指向下一个节点的指针next
。1. 添加节点:
addAtHead(int val)
方法会在链表头部插入一个新节点。它创建一个新的节点,将新节点的next
指向当前头节点,然后更新dummyhead
的next
指针为新节点,并增加链表的大小size
。
addAtTail(int val)
方法会在链表尾部插入一个新节点。它遍历链表直到最后一个节点,然后将新节点插入到最后一个节点的后面,并增加链表的大小size
。
addAtIndex(int index, int val)
方法会在指定索引处插入一个新节点。它遍历链表直到达到指定索引的前一个节点,然后将新节点插入到前一个节点的后面,并增加链表的大小size
。2. 获取节点:
get(int index)
方法会获取指定索引处节点的值。它遍历链表直到达到指定索引的节点,并返回该节点的值。3. 删除节点:
deleteAtIndex(int index)
方法会删除指定索引处的节点。它遍历链表直到达到指定索引的前一个节点,然后将前一个节点的next
指针指向要删除节点的下一个节点,并释放被删除节点的内存,最后减少链表的大小size
。