題目
反轉一個單鏈表。
示例:
輸入: 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;
}
算法設計:雙指針
初始鏈表如下:
反轉鏈表如下:
發現結點並沒有改變,只是指向完全改過來了。
那我們遍歷一次,遍歷每個結點的過程中,把每個結點的指向換一個方向即可。
道具:倆個指針 pre
、cur
。
初始:
從第一個結點開始,cur->next = pre
這樣指針就反轉它的指向,完成第一個結點的反轉。
接着,對第二個結點反轉:
pre
指向 cur
,cur
指向 next
,next
指向 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;
}
- 時間複雜度:
- 空間複雜度: