逆置单链表

我自己的方法是用的递归,毕竟也是接触了一点点点点点点 scheme 的骚年是吧,代码如下:

ListNode* reverseList(ListNode* head) {
    if (head == nullptr){
        return nullptr;
    }
    
    ListNode* newHead = nullptr;
    
    function<void(ListNode*)> reverse;
    reverse = [&](ListNode* node)
    {
        if (node->next == nullptr){
            newHead = node;
            return;
        }
        
        reverse(node->next);
        node->next->next = node;
        node->next = nullptr;
    };
    reverse(head);
    return newHead;
}

毕竟是递归,我琢磨着会不会迭代会快一点,于是有了如下版本:

ListNode* reverseList(ListNode* head) {
    if (head == nullptr || head->next == nullptr){
        return head;
    }
    
    ListNode* previous = head;
    ListNode* current  = head->next;
    ListNode* next     = nullptr;
    while (current != nullptr){
        next = current->next;
        current->next = previous;
        previous = current;
        current  = next;
    }
    head->next = nullptr;
    return previous;
}

 结果也是 8ms 啊,令人失望。

然后这是在过了一周之后,我写的代码:

ListNode* reverseList(ListNode* head)
{
    if (head == nullptr || head->next == nullptr){
        return head;
    }
    
    auto newHead = reverseList(head->next);
    head->next->next = head;
    head->next = nullptr;
    return newHead;
}

 

posted @ 2015-08-04 17:15  wu_overflow  阅读(161)  评论(0)    收藏  举报