美文网首页程序员
92. Reverse Linked List II

92. Reverse Linked List II

作者: Nautilus1 | 来源:发表于2017-11-02 10:54 被阅读0次

    题目描述:通过一次遍历使链表m ~ n的元素位置翻转,要求空间复杂度O(1)。如:

    Given 1->2->3->4->5->NULL, m = 2 and n = 4,
    return 1->4->3->2->5->NULL.

    分析:时间复杂度O(n),空间O(1)。

    代码:链表的第 m 到第 n 个,画图分析过程更清晰。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* reverseBetween(ListNode* head, int m, int n) {
            ListNode l(-1);
            l.next = head;
            
            ListNode *pre = &l;
            int i;
            for (i = 0; i < m - 1; i ++)      //先找到m - 1的位置
                pre = pre->next;
            ListNode* p = pre;       //p指向前部分不需改变的最后一个位置,在循环过程中始终不变
            
            pre = p->next;
            ListNode* cur = pre->next;        //初始时p、pre、cur分别在m位置的前一个,m,后一个,后面的循环保持p、pre、cur的前后相对位置
            for (i = m; i < n; i ++)         //循环过程将pre所指到n的元素每次用头插法插到p的后一个位置
            {
                pre->next = cur->next;          //先将pre指向cur的后一个,链上这一趟不许需变换的尾巴
                cur->next = p->next;             //cur指向当前要变换的开头,即m位置
                p->next = cur;            //头插法完成m位置后第 i 个元素的插入
                cur = pre->next;          //重新指向下一个要处理的位置,保持p、pre、cur的相对位置
            }
            return l.next;
        }
    };
    

    相关文章

      网友评论

        本文标题:92. Reverse Linked List II

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