L30.【LeetCode笔记】计划链表

立山  论坛元老 | 2025-4-18 20:52:50 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1989|帖子 1989|积分 5967

1.标题

   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 的节点。
  
  示例:
  1. <strong>输入</strong>
  2. ["MyLinkedList", "addAtHead", "addAtTail", "addAtIndex", "get", "deleteAtIndex", "get"]
  3. [[], [1], [3], [1, 2], [1], [1], [1]]
  4. <strong>输出</strong>
  5. [null, null, null, null, 2, null, 3]
  6. <strong>解释</strong>
  7. MyLinkedList myLinkedList = new MyLinkedList();
  8. myLinkedList.addAtHead(1);
  9. myLinkedList.addAtTail(3);
  10. myLinkedList.addAtIndex(1, 2);    // 链表变为 1->2->3
  11. myLinkedList.get(1);              // 返回 2
  12. myLinkedList.deleteAtIndex(1);    // 现在,链表变为 1->3
  13. myLinkedList.get(1);              // 返回 3
复制代码

  提示:
  

  • 0 <= index, val <= 1000
  • 请不要使用内置的 LinkedList 库。
  • 调用 get、addAtHead、addAtTail、addAtIndex 和 deleteAtIndex 的次数不凌驾 2000 。
  2.代码

直接套用+修改C26.【C++ Cont】动态内存管理和面向对象的方式实现链文章的代码
  1. struct Node
  2. {
  3.     int val;
  4.     struct Node* next;
  5. };
  6. class MyLinkedList
  7. {
  8. public:
  9.     Node* phead;
  10.     Node* ptail;
  11.     int length;
  12.     Node* BuySLTNode(int x)//新建节点
  13.     {
  14.         Node* newnode = new Node;
  15.         newnode->val = x;
  16.         newnode->next = nullptr;
  17.         return newnode;
  18.     }
  19.     MyLinkedList()//构造函数,自动调用
  20.     {
  21.         phead = nullptr;
  22.         ptail = nullptr;
  23.         length = 0;
  24.     }
  25.     int get(int index)
  26.     {
  27.         if (length == 0 || index >= length)
  28.             return -1;
  29.         int tmp = 0;
  30.         Node* cur = phead;
  31.         while (tmp != index)
  32.         {
  33.             cur = cur->next;
  34.             tmp++;
  35.         }
  36.         return cur->val;
  37.     }
  38.     void addAtHead(int val)
  39.     {
  40.         Node* newnode = BuySLTNode(val);
  41.         if (phead == nullptr)
  42.         {
  43.             phead = ptail = newnode;
  44.         }
  45.         else
  46.         {
  47.             newnode->next = phead;
  48.             phead = newnode;//不用改动ptail
  49.         }
  50.         length++;
  51.     }
  52.     void addAtTail(int val)
  53.     {
  54.         Node* newnode = BuySLTNode(val);
  55.         if (phead == nullptr)
  56.         {
  57.             ptail = phead = newnode;//如果是第一次插入需要同时更新首尾指针
  58.         }
  59.         else
  60.         {
  61.             ptail->next = newnode;
  62.             ptail = ptail->next;
  63.         }
  64.         length++;
  65.     }
  66.     void addAtIndex(int index, int val)
  67.     {
  68.         if (index > length)
  69.             return;
  70.         if (index == length)
  71.         {
  72.             addAtTail(val);
  73.             return;
  74.         }
  75.         if (index == 0)
  76.         {
  77.             addAtHead(val);
  78.             return;
  79.         }
  80.         Node* newnode = BuySLTNode(val);
  81.         Node* cur = phead;
  82.         int tmp = 0;
  83.         while (tmp < index - 1)
  84.         {
  85.             cur = cur->next;
  86.             tmp++;
  87.         }
  88.         newnode->next = cur->next;
  89.         cur->next = newnode;
  90.         length++;
  91.     }
  92.     void SLTPopBack()//尾删节点
  93.     {
  94.         if (phead == nullptr)
  95.         {
  96.             return;
  97.         }
  98.         Node* tmp = phead;
  99.         if (phead->next == nullptr)
  100.         {
  101.             delete phead;
  102.             ptail = phead = nullptr;//删除最后一个节点,注意将首尾指针都置为空
  103.             length--;
  104.             return;
  105.         }
  106.         while (tmp->next != ptail)//寻找尾节点前面的节点
  107.         {
  108.             tmp = tmp->next;
  109.         }
  110.         delete ptail;
  111.         ptail = tmp;
  112.         ptail->next = nullptr;
  113.         tmp = nullptr;
  114.         length--;
  115.     }
  116.     void SLTPopFront()//头删节点
  117.     {
  118.         if (phead == nullptr)
  119.         {
  120.             return;
  121.         }
  122.         if (phead->next == nullptr)
  123.         {
  124.             ptail = nullptr;//链表只剩一个节点,ptail要手动置空
  125.         }
  126.         Node* tmp = phead;
  127.         phead = tmp->next;
  128.         delete tmp;
  129.         tmp = nullptr;
  130.         length--;
  131.     }
  132.     void deleteAtIndex(int index)
  133.     {
  134.         if (index >= length || length == 0)
  135.             return;
  136.         if (index == length - 1)
  137.         {
  138.             SLTPopBack();
  139.             return;
  140.         }
  141.         if (index == 0)
  142.         {
  143.             SLTPopFront();
  144.             return;
  145.         }
  146.         Node* cur = phead;
  147.         int tmp = 0;
  148.         while (tmp < index - 1)//index-1>0
  149.         {
  150.             cur = cur->next;
  151.             tmp++;
  152.         }
  153.         Node* indexnode = cur->next;
  154.         cur->next = indexnode->next;
  155.         delete indexnode;
  156.         indexnode = nullptr;
  157.         length--;
  158.     }
  159. };
复制代码
注意点:

1.每一种环境返回前思索需不需要length++大概length--

★以SLTPopBack为例,有两个地方需要length--!!!(此处debug 1h 才看出来标题= =)

2.几个特殊环境的处理

get:链表长为0大概index>=length的,一律返回-1
addAtIndex:index>length不作处理,index==length按题意理解为尾插,index==0为头插
deleteAtIndex:链表长为0大概index>=length的,一律不处理;index == length - 1尾删;index == 0头删
3.提交效果



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立山

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表