题目(leecode T707):
在链表类中实现这些功能:
- get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
- addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
- addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
- addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
- deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
- 思路:本题是刚开始学习数据结构时的基础题目,但现在编程时这些功能大多都已经有内置的函数与方法不需要自己写,所以有时突然做可能会突然卡住。
- 1:首先是定义链表的数据结构,可以自己定义一个构造函数,优势体现在手写一个构造函数之后构造新节点时可以直接调用一行语句就可以完成。
- 2:初始化链表时可以定义一个虚拟节点,这样更方便(在上一篇Day6中有体现)
- 3:在输入中有inedx时要先判断一下index的值是否是合法满足题目需求定义的。
- 4:因为构造了虚拟的头节点所以头插法更加的方便。
- 5:尾插法要先遍历整个链表,让指针只想最后一个结点。
- 6:指定index插入要index--,遍历到指定位置插入,删除同理。
-
class MyLinkedList { public: struct LinkNode{ int val; LinkNode* next; LinkNode(int val):val(val),next(NULL){} }; MyLinkedList() { dummyHead = new LinkNode(0); size = 0; } int get(int index) { if(index > (size - 1)||index < 0){ //判断index是否为非法数值 return -1; } LinkNode* cur = dummyHead -> next; while(index--){ cur = cur->next; } return cur -> val; } void addAtHead(int val) { LinkNode* newNode = new LinkNode(val); newNode -> next = dummyHead -> next; dummyHead -> next = newNode; size++; } void addAtTail(int val) { LinkNode* newNode = new LinkNode(val); LinkNode* cur = dummyHead; while(cur->next != NULL){ cur = cur -> next; } cur -> next = newNode; size++; } void addAtIndex(int index, int val) { if(index > size) return; if(index < 0) index = 0; LinkNode* newNode = new LinkNode(val); LinkNode* cur = dummyHead; while(index--) { cur = cur->next; } newNode->next = cur->next; cur->next = newNode; size++; } void deleteAtIndex(int index) { if (index >= size || index < 0) { return; } LinkNode* cur = dummyHead; while(index--) { cur = cur ->next; } LinkNode* tmp = cur->next; cur->next = cur->next->next; delete tmp; tmp=nullptr; size--; } private: LinkNode* dummyHead; int size; };