<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      代碼隨想錄Day3鏈表part01

      1. 移除鏈表元素
        https://leetcode.cn/problems/remove-linked-list-elements/
        只要理解鏈表在內存中的存儲,這道題的思路還是非常簡單的,收獲最大的應該是對于虛擬節點的使用,在我之前的學習過的課程中也稱為“哨兵”節點,但是之前一直沒有理解為什么要使用這么一個節點,只是所有實現鏈表這一結構的課程中都喜歡這么做,今天做了前面兩道題也算是徹底理解了。我的理解是:虛擬節點有利于將頭節點去“特殊化”,是它不需要被我們額外處理,這就可以節省很多代碼,因為不需要再對頭節點做任何特殊的處理了。
        截圖 2025-07-11 11-02-51
      點擊查看代碼
      class Solution {
      public:
          ListNode* removeElements(ListNode* head, int val) {
              // 刪除頭結點
              while (head != NULL && head->val == val) { // 注意這里不是if
                  ListNode* tmp = head;
                  head = head->next;
                  delete tmp;
              }
      
              // 刪除非頭結點
              ListNode* cur = head;
              while (cur != NULL && cur->next!= NULL) {
                  if (cur->next->val == val) {
                      ListNode* tmp = cur->next;
                      cur->next = cur->next->next;
                      delete tmp;
                  } else {
                      cur = cur->next;
                  }
              }
              return head;
          }
      };
      
      
      1. 設計鏈表
        https://leetcode.cn/problems/design-linked-list/
        這題中在掌握鏈表的基礎知識和虛擬節點的使用,如果不會就直接看代碼隨想錄網站對應的部分即可,下面直接給出最后答案。
      點擊查看代碼
      class MyLinkedList {
      public:
          // 定義鏈表節點結構體
          struct LinkedNode {
              int val;
              LinkedNode* next;
              LinkedNode(int val):val(val), next(nullptr){}
          };
      
          // 初始化鏈表
          MyLinkedList() {
              _dummyHead = new LinkedNode(0); // 這里定義的頭結點 是一個虛擬頭結點,而不是真正的鏈表頭結點
              _size = 0;
          }
      
          // 獲取到第index個節點數值,如果index是非法數值直接返回-1, 注意index是從0開始的,第0個節點就是頭結點
          int get(int index) {
              if (index > (_size - 1) || index < 0) {
                  return -1;
              }
              LinkedNode* cur = _dummyHead->next;
              while(index--){ // 如果--index 就會陷入死循環
                  cur = cur->next;
              }
              return cur->val;
          }
      
          // 在鏈表最前面插入一個節點,插入完成后,新插入的節點為鏈表的新的頭結點
          void addAtHead(int val) {
              LinkedNode* newNode = new LinkedNode(val);
              newNode->next = _dummyHead->next;
              _dummyHead->next = newNode;
              _size++;
          }
      
          // 在鏈表最后面添加一個節點
          void addAtTail(int val) {
              LinkedNode* newNode = new LinkedNode(val);
              LinkedNode* cur = _dummyHead;
              while(cur->next != nullptr){
                  cur = cur->next;
              }
              cur->next = newNode;
              _size++;
          }
      
          // 在第index個節點之前插入一個新節點,例如index為0,那么新插入的節點為鏈表的新頭節點。
          // 如果index 等于鏈表的長度,則說明是新插入的節點為鏈表的尾結點
          // 如果index大于鏈表的長度,則返回空
          // 如果index小于0,則在頭部插入節點
          void addAtIndex(int index, int val) {
      
              if(index > _size) return;
              if(index < 0) index = 0;        
              LinkedNode* newNode = new LinkedNode(val);
              LinkedNode* cur = _dummyHead;
              while(index--) {
                  cur = cur->next;
              }
              newNode->next = cur->next;
              cur->next = newNode;
              _size++;
          }
      
          // 刪除第index個節點,如果index 大于等于鏈表的長度,直接return,注意index是從0開始的
          void deleteAtIndex(int index) {
              if (index >= _size || index < 0) {
                  return;
              }
              LinkedNode* cur = _dummyHead;
              while(index--) {
                  cur = cur ->next;
              }
              LinkedNode* tmp = cur->next;
              cur->next = cur->next->next;
              delete tmp;
              //delete命令指示釋放了tmp指針原本所指的那部分內存,
              //被delete后的指針tmp的值(地址)并非就是NULL,而是隨機值。也就是被delete后,
              //如果不再加上一句tmp=nullptr,tmp會成為亂指的野指針
              //如果之后的程序不小心使用了tmp,會指向難以預想的內存空間
              tmp=nullptr;
              _size--;
          }
      
          // 打印鏈表
          void printLinkedList() {
              LinkedNode* cur = _dummyHead;
              while (cur->next != nullptr) {
                  cout << cur->next->val << " ";
                  cur = cur->next;
              }
              cout << endl;
          }
      private:
          int _size;
          LinkedNode* _dummyHead;
      
      };
      
      
      1. 翻轉鏈表
        https://leetcode.cn/problems/reverse-linked-list/
        此體考查對于雙指針的運用,pre記錄前一個節點,cur記錄現在的節點,重點在于要使用一個temp指針存儲cur之后的節點,否則后續將無法繼續翻轉,因為你已經無法找到后續的節點了,內存已經泄漏。
      點擊查看代碼
      class Solution {
      public:
          ListNode* reverseList(ListNode* head) {
              ListNode* temp; // 保存cur的下一個節點
              ListNode* cur = head;
              ListNode* pre = NULL;
              while(cur) {
                  temp = cur->next;  // 保存一下 cur的下一個節點,因為接下來要改變cur->next
                  cur->next = pre; // 翻轉操作
                  // 更新pre 和 cur指針
                  pre = cur;
                  cur = temp;
              }
              return pre;
          }
      };
      
      
      posted @ 2025-07-11 11:10  YZranger  閱讀(57)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧洲无码一区二区三区在线观看| 麻花传媒在线观看免费| 久久精品无码av| 天堂а√在线最新版中文在线| 深夜福利资源在线观看| 激情亚洲一区国产精品| 亚洲精品人成网线在线播放va| 精精国产xxx在线观看| 日本亚洲欧洲无免费码在线| 一边捏奶头一边高潮视频| 久久国产热这里只有精品| 成人亚欧欧美激情在线观看| 韩国三级网一区二区三区| 免费无码成人AV片在线| 无码熟妇人妻AV影音先锋| 日韩精品亚洲精品第一页| 中文字幕免费不卡二区| 精品日本免费一区二区三区| 昆山市| 青青草国产自产一区二区| 亚洲第一国产综合| 黑色丝袜脚交视频麻豆| 人妻一区二区三区人妻黄色| 国产麻豆精品一区二区三区v视界| 国产精品一线天粉嫩av| 亚洲爆乳WWW无码专区| 小嫩批日出水无码视频免费| 五月天国产成人av免费观看| 真实国产乱啪福利露脸| 国产精品久久一区二区三区| 久久无码av中文出轨人妻| 中文字幕有码在线第十页| 亚洲国产日韩一区三区| 亚洲精品国自产拍影院| 在线观看中文字幕国产码| 国产精品自在自线视频| 日韩精品一卡二卡三卡在线| 中文字幕永久精品国产| 亚洲人成网站免费播放| 久久综合伊人| 少妇性l交大片|