题解 | #反转链表#

反转链表

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. (递归)

全部评论

相关推荐

01-30 09:45
燕山大学 Java
喵_coding:这种直接跑就完事了 哪有毕业了才签合同 任何offer和三方都没有的
点赞 评论 收藏
分享
找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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