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

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

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

      DAY4 鏈表part02

       

      今日任務

      ●  24. 兩兩交換鏈表中的節點

      ●  19.刪除鏈表的倒數第N個節點

      ●  面試題 02.07. 鏈表相交

      ●  142.環形鏈表II

      ●  總結   //有一定難度,需要好好琢磨

      24. 兩兩交換鏈表中的節點

      用虛擬頭結點,這樣會方便很多。

      題目鏈接/文章講解/視頻講解: https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html

      *注意畫圖理清思路

       1 /**
       2  * Definition for singly-linked list.
       3  * struct ListNode {
       4  *     int val;
       5  *     ListNode *next;
       6  *     ListNode() : val(0), next(nullptr) {}
       7  *     ListNode(int x) : val(x), next(nullptr) {}
       8  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
       9  * };
      10  */
      11 class Solution {
      12 public:
      13     ListNode* swapPairs(ListNode* head) {
      14         ListNode* dummy=new ListNode(0);
      15         dummy->next=head;
      16         ListNode* p=dummy;
      17         ListNode* q=dummy->next;
      18 
      19         while(q!=NULL&&q->next!=NULL)
      20         {
      21             ListNode* tmp=q->next;
      22             q->next=tmp->next;
      23             tmp->next=q;
      24             p->next=tmp;
      25 
      26             p=p->next->next;//p走兩格
      27             q=q->next;
      28         }
      29         head=dummy->next;
      30         return head;
      31     }
      32 };

       

      19.刪除鏈表的倒數第N個節點

      雙指針的操作,要注意,刪除第N個節點,那么我們當前遍歷的指針一定要指向 第N個節點的前一個節點

      題目鏈接/文章講解/視頻講解:https://programmercarl.com/0019.%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%ACN%E4%B8%AA%E8%8A%82%E7%82%B9.html

      *雙指針的經典用法:讓fast先走N,再讓fast和slow同時走,直到fast到尾結點,此時slow指向目標節點的前一位置,即倒數N+1結點;

       1 /**
       2  * Definition for singly-linked list.
       3  * struct ListNode {
       4  *     int val;
       5  *     ListNode *next;
       6  *     ListNode() : val(0), next(nullptr) {}
       7  *     ListNode(int x) : val(x), next(nullptr) {}
       8  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
       9  * };
      10  */
      11 class Solution {
      12 public:
      13     ListNode* removeNthFromEnd(ListNode* head, int n) {
      14         ListNode* dummy=new ListNode(0);
      15         dummy->next=head;
      16         ListNode* fast=dummy;
      17         ListNode* slow=dummy;
      18         for(int i=0;i<n;i++) fast=fast->next;
      19 
      20         while(fast->next!=NULL)//注意此條件
      21         {
      22             fast=fast->next;
      23             slow=slow->next;
      24         }//出循環時fast指向最后一個節點,slow指向目標節點前一個結點
      25         ListNode* tmp=slow->next;
      26         slow->next=tmp->next;
      27         delete(tmp);
      28         //以上三行可寫作 slow->next=slow->next->next;
      29 
      30         head=dummy->next;
      31         return head;
      32     }
      33 };
       

      面試題 02.07. 鏈表相交

      題目鏈接/文章講解:https://programmercarl.com/%E9%9D%A2%E8%AF%95%E9%A2%9802.07.%E9%93%BE%E8%A1%A8%E7%9B%B8%E4%BA%A4.html

      方法一:讓A和B“對齊”,從而同步移動指針,可以找到公共首節點;

       1 /**
       2  * Definition for singly-linked list.
       3  * struct ListNode {
       4  *     int val;
       5  *     ListNode *next;
       6  *     ListNode(int x) : val(x), next(NULL) {}
       7  * };
       8  */
       9  //對齊
      10 class Solution {
      11 public:
      12     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
      13         int lenA=0;
      14         int lenB=0;
      15         ListNode* cura=headA;
      16         ListNode* curb=headB;
      17         while(cura!=NULL) 
      18         {
      19             lenA++;
      20             cura=cura->next;
      21         }
      22         while(curb!=NULL) 
      23         {
      24             lenB++;
      25             curb=curb->next;
      26         }
      27         cura=headA;
      28         curb=headB;
      29         if(lenA>lenB)
      30         {
      31             int cnt=lenA-lenB;
      32             while(cnt--) cura=cura->next;
      33         }
      34         else if(lenA<lenB)
      35         {
      36             int cnt=lenB-lenA;
      37             while(cnt--) curb=curb->next;
      38         }//分類討論
      39         while(cura!=NULL&curb!=NULL)
      40         {
      41             if(cura==curb) return cura;
      42             else 
      43             {
      44                 cura=cura->next;
      45                 curb=curb->next;
      46             }
      47         }
      48         return cura;
      49         }
      50 };

      方法二:合并鏈表實現同步移動(畫圖)

       1 /**
       2  * Definition for singly-linked list.
       3  * struct ListNode {
       4  *     int val;
       5  *     ListNode *next;
       6  *     ListNode(int x) : val(x), next(NULL) {}
       7  * };
       8  */
       9  //合并鏈表實現同步移動
      10 class Solution {
      11 public:
      12     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
      13         ListNode* curA=headA;
      14         ListNode* curB=headB;
      15         while(curA!=curB)
      16         {
      17             if( curA==NULL) curA=headB;
      18             else curA=curA->next;
      19 
      20             if(curB==NULL) curB=headA;
      21             else curB=curB->next;
      22         }
      23         return curA;
      24     }//理解
      25 };

       

      142.環形鏈表II

      題目鏈接/文章講解/視頻講解:https://programmercarl.com/0142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II.html

      *明確任務:判斷有無環和找到入環的第一結點

      *思想:雙指針判斷有無環(fast=fast->next->next,slow=slow->next),經證明,若fast和slow相遇,則一定有環且在環內相遇;

         數學證明,若meet從相遇結點出發,index從head出發,則二者會在環的首節點相遇(相同速度);

       1 /**
       2  * Definition for singly-linked list.
       3  * struct ListNode {
       4  *     int val;
       5  *     ListNode *next;
       6  *     ListNode(int x) : val(x), next(NULL) {}
       7  * };
       8  */
       9 class Solution {
      10 public:
      11     ListNode *detectCycle(ListNode *head) {
      12         ListNode *fast=head;
      13         ListNode *slow=head;
      14 
      15         while(fast!=NULL&&fast->next!=NULL)//判斷有沒有環
      16         {
      17             slow=slow->next;
      18             fast=fast->next->next;
      19             if(fast==slow)//有環
      20             {
      21                 ListNode* meet=slow;//相遇節點
      22                 ListNode* index=head;//首節點
      23 
      24                 while(meet!=index)
      25                 {
      26                     meet=meet->next;
      27                     index=index->next;
      28                 }相遇則找到環的入口
      29                 return meet;
      30             }
      31         }
      32         
      33             return NULL;//沒找到
      34     }
      35 };

       

      總結

      https://www.programmercarl.com/%E9%93%BE%E8%A1%A8%E6%80%BB%E7%BB%93%E7%AF%87.html

      重點:虛擬結點的使用非常重要~

       

      posted @ 2024-07-20 22:41  xzdmzrc  閱讀(14)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 精品人妻伦一二三区久久| 国产一区精品在线免费看| 日本一区不卡高清更新二区| 精品国产午夜福利伦理片| 国产精品视频中文字幕| 伊人久久大香线蕉AV网禁呦| 国产美女午夜福利视频| 国产伦码精品一区二区| 亚洲欧美自偷自拍视频图片| 亚洲国产欧美在线人成| 国产亚洲国产精品二区| 亚洲精品美女久久久久9999| 国产一区二区精品偷系列| 日本视频精品一区二区| 1000部精品久久久久久久久| brazzers欧美巨大| 日韩国产精品一区二区av| 国产精品SM捆绑调教视频| 国产一区二区不卡在线| 国产精品偷乱一区二区三区| 日本高清视频网站www| 午夜福利日本一区二区无码| 一区二区精品久久蜜精品| 国产精品麻豆成人av电影艾秋 | 国产国语毛片在线看国产| 黑森林福利视频导航| 亚洲综合一区国产精品| 潮喷失禁大喷水无码| 国产特色一区二区三区视频| 五月天丁香婷婷亚洲欧洲国产| 亚洲国产日韩a在线亚洲| 国精偷拍一区二区三区| 国产午夜福利视频在线| 亚洲av与日韩av在线| 在线观看无码av免费不卡网站| 免费看欧美日韩一区二区三区| 祁连县| 亚洲日本欧洲二区精品| 三上悠亚精品一区二区久久| 一本一本久久a久久精品综合| 美腿丝袜亚洲综合第一页|