题解 | #反转链表#

反转链表

http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca

1. 解法一(双指针)

ListNode* ReverseList(ListNode* pHead) {
        // 创建双指针,分别指向当前头节点和空指针
        ListNode* pre = pHead, *cur = nullptr;

        // 循环中,当前指针不能为空
        while(pre != nullptr){
            ListNode *new_node = pre->next;    //临时变量,用来存储pre节点的下一个节点
            pre->next = cur;    // 链表反转,将pre的指针指向cur节点
            cur = pre;    //指针+1
            pre = new_node;    // 指针+1
        }
        return cur;    // 返回当前节点,即为反转后的节点
    }

2. 解法二(交换)

 ListNode* ReverseList(ListNode* pHead) {
        ListNode* p = nullptr;
        while(pHead != nullptr){
            swap(pHead->next, p);    // 相当于p临时储存为Phead->next;
            swap(pHead, p);    // 交换head和p,达到反转的目的
        }
        return p;
    }

3. 解法三(递归)

 ListNode* ReverseList(ListNode* pHead) {
        if(head==nullptr || head->next == nullptr) return head;    // 终止条件
        ListNode *p = reverseList(head->next);
        head->next->next = head;
        head->next = nullptr;
        return p;
    }

4. 解法四(互换值)

 ListNode* reverseList(ListNode* head) {
        ListNode *p=nullptr;
        for(ListNode* x=head; x!=nullptr; x = x->next){
            p = new ListNode(x->val, p);
        }
        return p;
    }

5. 指定范围内链表反转(迭代)

ListNode* reverseBetween(ListNode* head, int left, int right) {
        // 迭代
        ListNode *dummyNode = new ListNode(-1);
        dummyNode->next = head;
        ListNode* cur = dummyNode;
        // 先走left步
        for(int i=1; i<left; ++i){
            cur = cur->next;
        }

        // 翻转
        head = cur->next;
        for(int i=left; i<right; ++i){
            ListNode* new_node = head->next;
            head->next = new_node->next;
            new_node->next = cur->next;
            cur->next = new_node;
        }
        return dummyNode->next;
    }

6. (递归)

全部评论

相关推荐

点赞 评论 收藏
分享
代码飞升:别用口语,后端就写后端,前端就写前端,最后别光后悔
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务