第二章 链表 part02

第二章 链表**part02**

24. 两两交换链表中的节点

题目链接 : https://leetcode.cn/problems/swap-nodes-in-pairs/

 

Code

 

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode() : val(0), next(nullptr) {}
*     ListNode(int x) : val(x), next(nullptr) {}
*     ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
   ListNode* swapPairs(ListNode* head) {

       // (相对)“ 核心 区”

       


       if(head == NULL)            // 分 情况     /   划分 情况
      {
           return NULL;

      }else
       if(head->next == NULL)
      {
           return head;

      }else
       if(head->next != NULL)
      {
           ListNode* spear = head->next->next;
           ListNode* p = head;

           //cout<<"head->val : "<<head->val<<endl;
           //cout<<"head->next ->val : "<<head->next ->val<<endl;

           ListNode* pre ;

           //**   pre 处理 位   , 没有 更 靠 前 的 了

           pre = p ;

           p->next ->next = p ;

           head = p->next;

           p->next = spear ;

           p = spear ;

           

           // 注意 不要 忘了 更新 头结点

       

           do
          {
               
               if(p == NULL)
              {
                   return head;

               // swapPairs 链表 处理 将要 结束
              }else
               if(p->next == NULL)
              {
                   return head;
              }else
               if(p->next != NULL)
              {
                   spear = p->next->next;
                   pre->next = p->next;

                   pre = p;

                   p->next ->next = p;

                   p->next = spear;

                   p = spear ;               // 注意 不要 忘了 更新 " p "


              }

          }while(p != NULL );


           return head;


      }

       return NULL;                //return head;

  }
};

 

 

19.删除链表的倒数第 N 个结点

题目链接 : https://leetcode.cn/problems/remove-nth-node-from-end-of-list/

 

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode() : val(0), next(nullptr) {}
*     ListNode(int x) : val(x), next(nullptr) {}
*     ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
   ListNode* removeNthFromEnd(ListNode* head, int n) {
       
       if(head == NULL)
      {
           return NULL;

      }else
       if(head->next == NULL)
      {
           if(n != 1)
          {
               //     cout<<"Error At removeNthFromEnd Parameter   \" n \" " << endl ;

               return NULL ;
          }
           else
          {
               return NULL ;

          }

      }
       else
      {
           ListNode* spear = head ;
           ListNode* p = head ;

           ListNode* pre = NULL ;     // 注意 对 指针 进行 初始化   以   提升 稳定性 ;

           //if(pre != NULL)
           //{
           //   cout<<"pre != NULL"<<endl;
           //
           //}

           int i = 0 ;

           for( ;i < n; i++)
          {
                                       //if(spear == NULL)     cout<<"Error At removeNthFromEnd Parameter   \" n \" "
               
               spear = spear->next;

          }

           /*
           if(spear == NULL)           // “ 伞 ” 没 拽 开 时 的 操作
           {                           // "pre"
               head = p -> next ;

           }
           */

           //cout<<111111111111<<endl;


           while(spear != NULL)            // 这里 的 代码 很有可能 被 优化 了
          {
               pre = p ;          
               p = p -> next ;
               spear = spear -> next ;

          }


           
           //cout<<"pre : "<<pre<<endl ;
           
           if(pre == NULL)
          {
               //cout<<22222222<<endl;          
               head = p -> next ;

               // 如果 pre 没有 被 拽 开

          }
           else
          {
               ////ListNode * temp = p -> next ;           // 注意 空 指针

               //if(temp == NULL)
               //{
               //   cout<<"temp == NULL"<<endl;
               //
               //}

               ////pre->next = temp;

               pre->next = p -> next ;

          }


           


           return head ;

      }


       




  }
};

 

 

面试题 02.07. 链表相交

题目链接 : https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/

 

Code (基础解 / 暴力解 )

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
   ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
       vector<ListNode *> numsA;
       vector<ListNode *> numsB;

       ListNode * pA = headA;
       ListNode * pB = headB;          // 练习   ,     过载 上升  

       //int Index_Find =

       ListNode * ptr_Find = NULL ;

       int Find = 0;


       while(pA != NULL)
      {
           numsA.push_back(pA);
           pA = pA -> next ;
      }

       while(pB != NULL)
      {
           numsB.push_back(pB);
           pB = pB -> next ;
      }

       int i = 0 ;

       int lenA = numsA.size();

       int j = 0 ;

       int lenB = numsB.size();

       for( ;i < lenA ; i++)
      {
           //cout<<"i = "<<i<<endl;
           //cout<<"ptr = "<<numsA[i]<<endl;

           j = 0 ;                     // 注意 对 j 进行 刷新

           for( ;j < lenB ; j++)
          {
               //cout<<"j = "<<j<<endl;
               //cout<<"ptr = "<<numsB[j]<<endl;

               if(numsA[i] == numsB[j])
              {
                   ptr_Find = numsA[i];

                   Find = 1;
                   //cout<<"Find "<<endl;

                   break;

              }

               if(Find == 1)
              {
                   break ;

              }


          }


      }


       return ptr_Find ;

       
  }
};

 

“ 双 指针 ” 步伐 协调 解 (一周目 和 二周目)

时间 复杂度 :O(n) 空间 复杂度 : O(1)

 

Code :

 

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
   ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
       vector<ListNode *> numsA;
       vector<ListNode *> numsB;

       ListNode * p1 = headA;
       ListNode * p2 = headB;          // 练习   ,     过载 上升  

       //int Index_Find =

       ListNode * ptr_Find = NULL ;

       int Find = 0;

       int count = 1;

       int Find_1_Round = 1;

       int Find_2_Round = 1;


       // 步伐 协同 型   Test

       while( (Find_1_Round < 3 && Find_2_Round < 3 ) )
      {
           if(Find_1_Round < 3 && Find_2_Round >= 3)
          {
               cout<<"Error At getIntersectionNode Asynchronous"<<endl;
          }

           if(Find_1_Round >= 3 && Find_2_Round < 3)
          {
               cout<<"Error At getIntersectionNode Asynchronous"<<endl;
          }

           if(p1 == p2)
          {
               return p1;
          }

           //cout<<"Find_1_Round = "<<Find_1_Round<<endl;
           //cout<<"Find_2_Round = "<<Find_2_Round<<endl;
           //cout<<"count = "<<count<<endl;


           //if(p1 != NULL)
           //{
               //cout<<"p1->val = "<<p1->val<<endl;
           //}

           //if(p2 != NULL)
           //{
               //cout<<"p2->val = "<<p2->val<<endl;
           //
           //}

           count++;


           
           
           if(Find_1_Round == 1)
          {
               if(p1 == NULL)
              {
                   Find_1_Round += 1;
                   p1 = headB;
              }
               else
              {
                   p1 = p1 -> next ;
              }

               
               
          }else
           if(Find_1_Round == 2)
          {
               if(p1 == NULL)
              {
                   Find_1_Round += 1;
                   //p1 = headA;
              }
               else
              {
                   p1 = p1 -> next ;
              }

               

               

          }


           if(Find_2_Round == 1)
          {
               if(p2 == NULL)
              {
                   Find_2_Round += 1;
                   p2 = headA;             // 注意 复制 并 修改 时 很有 可能 产生 错误
              }                                   // 注意 做好 区间 划分
               else{
                   p2 = p2 -> next ;
              }

               
               
          }else
           if(Find_2_Round == 2)
          {
               if(p2 == NULL)
              {
                   Find_2_Round += 1;
                   //p1 = headB;
              }
               else{
                   p2 = p2 -> next ;

              }

               

               
          }


           //cout<<"New Find_1_Round = "<<Find_1_Round<<endl;
           //cout<<"New Find_2_Round = "<<Find_2_Round<<endl;

           //cout<<endl;


      }


       return NULL ;



       
  }
};

 

 

142.环形链表 II

题目链接 : https://leetcode.cn/problems/linked-list-cycle-ii/

 

Code :

 

 

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
   ListNode *detectCycle(ListNode *head) {

                       // road

                       // 领先 步数       (环 外 长度)

                       // xx 补集

                       // xx 点 的 移动 2 * 补集

                       // 配合 之前 一个   领先 步数

                       //还 多出 1 * 补集

                       // 配合 一个 领先 步数 得出

       ListNode * p1 = head;
       ListNode * p2 = head;

       int count_1 = 0;
       int count_2 = 0;

       int Find_Cycle = 0;



       while((p1 != NULL )&&(p1->next != NULL) && p2 != NULL)
      {
           
           p1 = p1 -> next;
           p1 = p1 -> next;

           count_1 += 2 ;

           p2 = p2 -> next;

           count_2 += 1 ;

           if(p1 == p2)
          {
               Find_Cycle = 1;

               break;
          }

               // Logic :   count_1 - count_2 = (环 长度)

               // p1 的 绝对 位置 在 相对于 环 起点 (领先 步数) 补集 的 位置

               // 回到 环 起点 需要 (之前 的 一开始 的 领先 步数)

   
           
      }

       if(Find_Cycle == 1)
      {
           ListNode * p3 = head;

           do
          {
               if(p1 == p3)
              {
                   return p1;
              }

               p3 = p3 -> next;
               p1 = p1 -> next;

          }while(1);
      }
       else
      {
           return NULL;
      }


       
  }
};
 
posted @ 2023-12-02 23:58  晴夜空  阅读(12)  评论(0)    收藏  举报