思路
本题考察了链表的常用操作
get():获取链表第index个节点的值
addAtHead():链表头插一个节点
addAtTail():链表尾插一个节点
addAtIndex():在链表第index个节点前面插入一个节点
deleteAtIndex():删除链表位置的第index个节点
使用虚拟头结点来实现
首先,我们需要定义一个结构体 LinkedNode,表示链表的节点。该结构体包含两个成员变量:val 表示节点的值,next 表示指向下一个节点的指针。然后,我们在类中定义一个私有变量 _dummyHead,表示链表的虚拟头结点,并初始化为 nullptr。同时,我们还定义一个私有变量 _size,表示链表中节点的数量,并初始化为 0。
在各个操作函数中,我们需要事先做一些判断,本题中各个函数也给出了相应的提示;另外,还有一些实现上的细节,如插入newnode时的顺序。
class MyLinkedList {
public:
MyLinkedList() {
_dummyHead = new LinkedNode(0);
_size = 0;
}
//1.获取链表第index个节点的值
int get(int index) {
if (index >= 0 && index <= _size - 1)
{
LinkedNode* cur = _dummyHead->next;
while (index)
{
cur = cur->next;
index--;
}
return cur->val;
}
return -1;
}
//2.链表头插一个节点
void addAtHead(int val) {
LinkedNode* newnode = new LinkedNode(val);
newnode->next = _dummyHead->next;//先
_dummyHead->next = newnode;//后 顺序不能颠倒,否则找不到_dummyHead->next
++_size;
//可以复用4
//addAtIndex(0, val);
}
//3.链表尾插一个节点
void addAtTail(int val) {
LinkedNode* cur = _dummyHead;
LinkedNode* newnode = new LinkedNode(val);
while (cur->next != nullptr)
{
cur = cur->next;
}
cur->next = newnode;
++_size;
//可以复用4
//addAtIndex(_size, val);
}
//4.在链表第index个节点前面插入一个节点
void addAtIndex(int index, int val) {
if (index > _size)
return;
if (index < 0)
index = 0;
LinkedNode* newnode = new LinkedNode(val);
LinkedNode* cur = _dummyHead;
//需要注意的是单链表要节点往后插入
//比如在第3个节点前插入val,实现时就要第2个节点后插入val
while (index--)
{
cur = cur->next;
}
newnode->next = cur->next;
cur->next = newnode;
++_size;
}
//5.删除链表位置的第index个节点
void deleteAtIndex(int index) {
if (index >= 0 && index <= _size - 1)
{
LinkedNode* cur = _dummyHead;
while (index--)
{
cur = cur->next;
}
LinkedNode* tmp = cur->next;
cur->next = tmp->next;
delete tmp;
--_size;
}
return;
}
private:
struct LinkedNode
{
int val;
LinkedNode* next;
LinkedNode(int _val) :val(_val), next(nullptr) {}
};
int _size;
LinkedNode* _dummyHead;
};