Leetcode題庫劍指 Offer 24. 反轉連結串列(頭插法 c實現)
阿新 • 來源:網路 • 發佈:2022-05-24
思路
方法1:頭插法
ret為返回連結串列的頭部
head_last指向下一個加入ret的節點
每次將head取出使用頭插法將其插入ret
然後head=head_last, head_last=head->next
如此迴圈直至head_last為NULL
舉例:
head_last: 2 -> 3
head: 1 #將head插入ret連結串列
ret: 1
head: 2 -> 3
head_last: 3
head: 2 #將head插入ret連結串列
ret: 2 -> 1
head: 3
head_last: NULL
head: 3 #將head插入ret連結串列
ret: 3 -> 2 -> 1
head_last: NULL跳出迴圈
方法2:遞迴
使用遞迴,遞迴到head連結串列尾部,隨著每一層遞迴的返回記錄當前的head節點到新連結串列中,最後也能達到反轉連結串列的效果
舉例:
第一層:
head: 1 -> 2 -> 3
head->next 不為空
繼續遞迴
第二層:
head: 2 -> 3
head->next 不為空
繼續遞迴
第三層:
head: 3
head->next 為空
返回將當前節點加入新連結串列(ret = 3 -> NULL)
返回第二層:
返回將當前節點加入新連結串列(ret = 3 -> 2 -> NULL)
返回第一層:
返回將當前節點加入新連結串列(ret = 3 -> 2 -> 1 -> NULL)
程式碼
頭插法
struct ListNode* reverseList(struct ListNode* head){
struct ListNode *ret,*head_last;
while(head != NULL){
head_last = head->next;
head->next = ret;
ret = head;
if(head_last == NULL) break;
head = head_last;
}
return ret;
}
