欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > [LeetCode]day10 707.设计链表

[LeetCode]day10 707.设计链表

2025/2/2 7:48:05 来源:https://blog.csdn.net/qq_65173003/article/details/145415461  浏览:    关键词:[LeetCode]day10 707.设计链表

707. 设计链表 - 力扣(LeetCode)

题目描述

你可以选择使用单链表或者双链表,设计并实现自己的链表。

单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。

如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。

实现 MyLinkedList 类:

  • MyLinkedList() 初始化 MyLinkedList 对象。
  • int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
  • void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
  • void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
  • void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
  • void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。

示例:

输入
["MyLinkedList", "addAtHead", "addAtTail", "addAtIndex", "get", "deleteAtIndex", "get"]
[[], [1], [3], [1, 2], [1], [1], [1]]
输出
[null, null, null, null, 2, null, 3]解释
MyLinkedList myLinkedList = new MyLinkedList();
myLinkedList.addAtHead(1);
myLinkedList.addAtTail(3);
myLinkedList.addAtIndex(1, 2);    // 链表变为 1->2->3
myLinkedList.get(1);              // 返回 2
myLinkedList.deleteAtIndex(1);    // 现在,链表变为 1->3
myLinkedList.get(1);              // 返回 3

提示:

  • 0 <= index, val <= 1000
  • 请不要使用内置的 LinkedList 库。
  • 调用 getaddAtHeadaddAtTailaddAtIndex 和 deleteAtIndex 的次数不超过 2000 

解题

我们创建一个虚拟头结点,使操作更简便一些。

class MyLinkedList {public:
//定义结点
struct linkNode{int val;linkNode*next;linkNode(int val):val(val),next(nullptr){}
};MyLinkedList() {this->size=0;this->head=new linkNode(0); //创建一个虚拟头结点}int get(int index) {if(index<0||index>=size){return -1;}//从有效结点开始遍历!linkNode*p=head->next;for(int i=0;i<index;i++){p=p->next;}return p->val;}void addAtHead(int val) {linkNode*newNode=new linkNode(val);newNode->next=head->next;head->next=newNode;size++;}void addAtTail(int val) {linkNode*p=head;while(p->next){p=p->next;}linkNode*newNode=new linkNode(val);p->next=newNode;size++;}void addAtIndex(int index, int val) {if (index > size) {return;}linkNode*p=head;for(int i=0;i<index;i++){p=p->next;}//遍历到前一个结点linkNode*newNode=new linkNode(val);newNode->next=p->next;p->next=newNode;size++;}void deleteAtIndex(int index) {if (index < 0 || index >= size) {return;}size--;linkNode*p=head;//遍历到前一个结点for(int i=0;i<index;i++){p=p->next;}linkNode*nodeTode=p->next;p->next=p->next->next;delete nodeTode;}
private:
int size; //真实结点数
linkNode* head;
};/*** 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);*/

易错点在于遍历时初始化linkNode*p 时 要初始化为头结点 即linkeNode*p=head;不能默认初始化为空

加了一个虚拟头结点之后相当于链表中实际上有size+1个结点 所以每次for循环如果是从head节点开始,都是遍历到第index个结点前的一个结点 而我们get函数中需要遍历到第index个结点 所以从第一个有效结点head->next开始!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com