题目
思路
-
为方便所有的节点操作相同,不用单独区分头结点,设置虚拟头结点dummyHead
-
首先设置结构体结点,包括:1. 数值 2. 指针
-
题中第几个节点就是第几个索引,index=几
-
初始化链表结构时,需要初始化头结点,整个链表长度的size计数
-
public可调用识别变量,设置private变量
-
最好在每个函数中,都表明cur指针的位置,不同函数需要指针指向位置不同
-
cur->dummyhead,则cur移动到指定位置会指向index,cur->dummyhead->next,移动指定位置指向index->next
-
C++11标准中,nullptr是一个所谓“指针空值类型”的常量
-
如果函数返回值是void,可在函数中将例外情况返回return;表示无法执行函数并跳出的情况
void test() { if() { return; } }
代码
class MyLinkedList {
public:
//建立节点
struct LinkNode
{
int val;
LinkNode* next;
//构造函数
LinkNode(int x):val(x),next(nullptr)
{
}
};
MyLinkedList() {
//指针初始化
dummyHead = new LinkNode(0);
size = 0;
LinkNode* cur;
}
int get(int index) {
if (index > (size - 1) || index < 0) {
return -1;
}
cur = dummyHead->next;
while(index--){ // 如果--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);
cur = dummyHead;
while(cur->next != nullptr)
{
cur = cur->next;
}
cur->next = newNode;
size++;
}
void addAtIndex(int index, int val) {
if (index > size)
{
return;
}
LinkNode* newNode = new LinkNode(val);
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;
}
cur = dummyHead;
while(index--)
{
cur = cur->next;
}
LinkNode* delNode = cur->next;
cur->next = cur->next->next;
delete delNode;
size--;
}
private:
LinkNode* dummyHead;
int size;
LinkNode* cur;
};
/**
* 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);
*/