美文网首页
025-Reverse List from M to N

025-Reverse List from M to N

作者: Woodlouse | 来源:发表于2020-06-01 22:26 被阅读0次

    描述

    在一个单链表中,在一次遍历中原地逆转从位置m到位置n的元素(1<=m<n<=list length)。

    输入:

    1->2->3->4->5->nullptr, m=2,n=4

    返回:

    1->4->3->2->5->nullptr

    分析

    在单链表能直接了解到的是链表头和下一个元素,能操作的元素也只有当前指针指向的元素,在操作当前元素时要记录当前元素的下一个元素。

    1,设定三个指针:

    ​ pCur初始值指向原始链表的头元素,pCur=pHead;

    ​ pNext初始值设置为当前元素的下一个元素pNext=pCur->next

    ​ pHead2初始值为nullptr,指向新链表的头,pHead2 = nullptr;

    2,操作当前指向的指针:

    ​ 将pCur指向的元素从原始链表中拆解出来,采用头插法添加到pHead2指向的链表并更新头元素的位置:

      ```
    

    pCur->next = pHead2->next;
    pHead2->next = pCur;
    ```

    3,更新下一步要在原始链表中操作的元素

    pCur = pNext;
    pNext = pNext->next;
    

    若pCur不为空,则继续2、3步操作,直到pCur指向为空。

    如图:


    逆转单列表

    考虑区间的逆转:

    1,寻找第m个元素及第m-1个元素;

    2,从m开始进行(n-m)次头插入操作;

    3,将新的链表链接到第m-1个元素后面;

    4,将新的链表尾部和第n+1个元素链接;

    5,考虑整个链表逆转时的头指针的更新;

    实现

    ListNode* reverseListM2N(ListNode *head, int m, int n)
    {
        //需要的变量
        ListNode resultNode(0);
        resultNode.next = head;
        
        //第m个节点
        ListNode *pNodeM = head;
        ListNode *pNodeBeforeM = nullptr;
        
        for(int i=1; i<m; i++) {
            pNodeBeforeM = pNodeM;
            pNodeM = pNodeM->next;
        }
        
        //逆置节点
        ListNode *pHeadTmp = nullptr;
        ListNode *pCur = pNodeM;
        for (int i=0; i<(n-m)+1 && pCur; i++) {
            ListNode *pNext = pCur->next;
            pCur->next = pHeadTmp;
            pHeadTmp = pCur;
            pCur = pNext;
        }
        
        if (pNodeBeforeM) {
            pNodeBeforeM->next = pHeadTmp;
        }
        pNodeM->next = pCur;
        
        return m==1 ? pHeadTmp : resultNode.next;
    }
    

    代码在这儿

    相关文章

      网友评论

          本文标题:025-Reverse List from M to N

          本文链接:https://www.haomeiwen.com/subject/loyezhtx.html