[leetcode][C++]兩兩交換鏈表中的節點

1.題目

給定一個鏈表,兩兩交換其中相鄰的節點,並返回交換後的鏈表。

你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。

 

示例:

給定 1->2->3->4, 你應該返回 2->1->4->3.

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/swap-nodes-in-pairs
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

2.code

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head==NULL)
          return NULL;
        if(head->next==NULL)
          return head;
        ListNode *pre,*p,*pcur,*phead;
       phead=new ListNode(-1);
       phead->next=head;
       pre=phead;
        p=pre->next;
        pcur=p->next;
       cout<<pre->val<<endl;
        while(p!=NULL)
        {
          //交換
          p->next=pcur->next;
          pcur->next=pre->next;
          pre->next=pcur;
          //移動
         if(p->next==NULL||p->next->next==NULL)
         {
           pre=p;
           p=NULL;
           pcur=NULL;
         }
          else
          {
            pre=p;
            p=pre->next;
            pcur=p->next;
          }
        
        }
      phead=phead->next;
      return phead;
    }
};

 3.分析

1.邊界判斷:鏈表爲空/鏈表只有一個元素

2.增設頭節點:因爲需要記錄三個狀態的值:pre,p,pcur,所以爲了統一,需要申請一個頭節點,最後返回的是這個頭節點的next所表示的鏈表,而不是head,返回head的話會丟失一個元素,因爲head就是原來第一個元素,交換之後,他就變成了第二個元素,所以head代表的是從第二個元素一直到最後結尾。

3.指針爲空的考慮:因爲我們圍繞p進行,當p->next爲空或者p->next->next爲空時,那麼NULL是沒有next操作的,那麼p,pcur的語句就會發生錯誤,所以需要額外考慮。因爲pre=p,所以p爲空不需要考慮。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章