描述
本题是力扣的707. 设计链表
考点
-
链表的常用操作设计
题解
class MyLinkedList {
private:
int size;
ListNode *dummyHead;
public:
MyLinkedList() : size(0), dummyHead(new ListNode(-1)) {}
int get(int index) {
if (index < 0 || index > size - 1) return -1;
ListNode *cur = dummyHead->next;
while (index--) cur = cur->next;
return cur->val;
}
void addAtHead(int val) {
dummyHead->next = new ListNode(val, dummyHead->next);
size++;
}
void addAtTail(int val) {
ListNode *cur = dummyHead;
while (cur->next != nullptr) cur = cur->next;
cur->next = new ListNode(val, nullptr);
size++;
}
void addAtIndex(int index, int val) {
if (index > size) return;
ListNode *cur = dummyHead;
while (index--) cur = cur->next;
cur->next = new ListNode(val, cur->next);
size++;
}
void deleteAtIndex(int index) {
if (index < 0 || index > size - 1) return;
ListNode *cur = dummyHead;
while (index--) cur = cur->next;
ListNode *tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
size--;
}
};
思路
题目较为简单,具体实现见代码即可;主要讲几个细节:
-
链表类的题基本都需要新增一个
dummyHead
伪节点,指向真正的头节点;以避免考虑操作头节点时的特殊情况 -
单链表类的题涉及迭代操作某一节点时,都应定位到该节点的前一节点;因为若不修改前一节点的
next
信息,新链表串不起来(使用递归或双向链表就可以自由发挥了)
比如需要删除节点3,我们需要定位到节点2
待处理完节点3后,需要将节点2与节点4连接起来,链表才是完整的
更多
恭喜你完成本题!
你可以选择继续下一题,或移步至仓库开始更多类型的挑战:https://fi3wey.github.io/
仓库内包含了更多经典案例的逻辑剖析与实现细节,助你在算法的学习之旅上一往无前!
看官若还满意,还请Star一下哟~
关注公众号峰狂算法
,获取最新的刷题指导呀~