LeetCode---24. 兩兩交換連結串列中的節點
阿新 • • 發佈:2018-11-10
題目來源:https://leetcode-cn.com/problems/swap-nodes-in-pairs/description/
題目描述:
演算法描述:該題目有兩種方法解決,一種遞迴,一種非遞迴
非遞迴方法:
1.如果連結串列只有一個或者沒有節點的話,直接返回head。
2.然後先交換第一個和第二個節點。(因為如果只有兩個結點的話這是一種特殊情況,需要單獨處理)
3.如果第一個結點和第二個節點交換完成以後,還有結點,就用迴圈進行交換。
程式碼如下:
struct ListNode* swapPairs(struct ListNode* head) { if(!head||!head->next) return head;//連結串列只有一個結點或沒有節點時直接返回 struct ListNode* l=head;//定義需要交換的左右節點 struct ListNode* r=l->next; struct ListNode* p; l->next=r->next;//交換第1個和第二個結點 r->next=l; head=r;//頭指標挪到原來的第二個節點上(現在是第一個結點),完成前兩個結點的交換 p=l;//p賦值為第一對交換成功的右節點 while(l->next&&l->next->next){//如果剩餘節點為0或1則返回head,否則進入迴圈 l=l->next;//轉換到下一節點對 r=l->next; l->next=r->next;//交換節點l,r r->next=l; p->next=r; p=l; } return head; }
遞迴方法:
利用遞迴的思想,依次交換連結串列中的節點對。具體對於每個節點來說:
1.若該節點為NULL,則直接返回NULL
2.若該節點的下一個節點為NULL,則直接返回該節點
3.交換該節點與下一個節點,利用輔助指標記錄該節點的下一個節點,並遞迴的交換接下來的節點對
該方法雖然比較簡單,但由於是遞迴所以執行時間會比較長。
程式碼如下:
struct ListNode* swapPairs(struct ListNode* head) { if(!head) return NULL; if(!head->next) return head; struct ListNode* temp=head->next; head->next=swapPairs(temp->next); temp->next=head; return temp; }