[206].反轉鏈表

 


題目

反轉一個單鏈表。

示例:

輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL

 


函數原型

C 的函數原型:

struct ListNode* reverseList(struct ListNode* head){}

 


邊界判斷

struct ListNode* reverseList(struct ListNode* head){
	if( head == NULL )
		return NULL;
}

 


算法設計:雙指針

初始鏈表如下:

反轉鏈表如下:

發現結點並沒有改變,只是指向完全改過來了。

那我們遍歷一次,遍歷每個結點的過程中,把每個結點的指向換一個方向即可。

道具:倆個指針 precur

初始:

從第一個結點開始,cur->next = pre 這樣指針就反轉它的指向,完成第一個結點的反轉。

接着,對第二個結點反轉:

pre 指向 curcur 指向 nextnext 指向 cur->next,就從第一個結點移動到第二個結點了。


cur -> next = pre 這樣指針就反轉它的指向。

總結一下:

  • 創建雙指針
  • 反轉當前結點的指向
  • 交換位置
struct ListNode* reverseList(struct ListNode* head){
	if( head == NULL )
		return NULL;

	struct ListNode* pre = NULL;
	struct ListNode* cur = head;
	// 先創建倆個指針

	while( cur != NULL ){
        struct ListNode* next = cur->next;
		 
        cur->next = pre;	// 反轉指向
        pre = cur;
        cur = next;
	}
	return pre;
}
  • 時間複雜度:Θ(n)\Theta(n)
  • 空間複雜度:Θ(1)\Theta(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章