您现在的位置是:首页 >技术交流 >链表--part 3--设计链表(leetcode 707)网站首页技术交流
链表--part 3--设计链表(leetcode 707)
简介链表--part 3--设计链表(leetcode 707)
文章目录
基本思想
这道题目设计链表的五个接口:
获取链表第index个节点的数值
在链表的最前面插入一个节点
在链表的最后面插入一个节点
在链表第index个节点前面插入一个节点
删除链表的第index个节点
可以说这五个接口,已经覆盖了链表的常见操作,是练习链表操作非常好的一道题目
链表操作的两种方式:
直接使用原来的链表来进行操作。
设置一个虚拟头结点在进行操作。
leetcode 707
class MyLinkedList {
public:
struct LinkedNode{
int data;
LinkedNode* next;
LinkedNode(int val = 0):data(val),next(nullptr){}
};
MyLinkedList() {
//使用虚拟节点,方便操作
head = new LinkedNode(0);
size = 0;
}
int get(int index) {
if((index + 1) > size || index < 0)
return -1;
LinkedNode* p = head->next;
//值得关注的是这里如果使用--index将会陷入死循环,理解一下为什么
while(index--)
{
p = p->next;
}
return p->data;
}
void addAtHead(int val) {
//直接头插入法
LinkedNode* p = new LinkedNode(val);
//此处直接等于即可,不论head后面是null还是有数据都是满足的
p->next = head->next;
head->next = p;
size++;
}
void addAtTail(int val) {
LinkedNode* p = head;
LinkedNode* q = new LinkedNode(val);
//循环寻找尾节点
while(p->next)
{
p = p->next;
}
p->next = q;
size++;
}
void addAtIndex(int index, int val) {
if(index < 0 || index > size)
return;
LinkedNode* p = head;
LinkedNode* q = new LinkedNode(val);
//循环寻找对应的节点
while(index--)
{
p = p->next;
}
//这里值得关注的是如果size=index的时候,会发现q->next=null其实也是满足的,故不用额外讨论。
q->next = p->next;
p->next = q;
size++;
}
void deleteAtIndex(int index) {
if((index + 1) > size || index < 0)
return;
LinkedNode* p = head;
LinkedNode* q;
//循环寻找对应的节点
while(index--)
{
p = p->next;
}
q = p->next;
p->next = q->next;
delete q;
size--;
}
private:
//定义虚拟头节点,方便操作
LinkedNode* head;
int size;
};
/**
* 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);
*/
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。