92. Reverse Linked List II

题目描述:通过一次遍历使链表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)