1. 程式人生 >實用技巧 >其它 >Leetcode題庫劍指 Offer 24. 反轉連結串列(頭插法 c實現)

Leetcode題庫劍指 Offer 24. 反轉連結串列(頭插法 c實現)


思路

方法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;
}