1. 程式人生 > >LeetCode---24. 兩兩交換連結串列中的節點

LeetCode---24. 兩兩交換連結串列中的節點

題目來源: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;
}