LeetCode - 0092 - Reverse Linked List II

题目概要

将指定范围内的链表翻转。

题目链接

Reverse Linked List II

题目解析

注意,题目中标注了条件:$1\le m \le n \le length_of_list$
我们现在来关注翻转某局部链表时,所需要进行的操作:

 [+]->[+]->[o]->[o]->[o]->[o]->[o]->[x]->[+]->[+]->^
       ^                        ^    ^
       |                        |    |
      tail                 revTail revHead

上图中[+]表示的结点为正常结点,而[o]为已经被翻转过的链表结点,[x]为正在被翻转的结点。
易知此时需要进行的操作如下:

revHead = revTail->next;
revTail->next = revHead->next;
revHead->next = tail->next;
tail->next = revHead;

之后,上述链表将变为如下图所示形式:

 [+]->[+]->[x]->[o]->[o]->[o]->[o]->[o]->[+]->[+]->^
       ^    ^                        ^
       |    |                        |
      tail revHead                revTail

如此反复多次,准确的说是$n-m$次后,就可以完成翻转了。
同时还需要注意的是$m==1$的情形。

复杂度分析

时间复杂度:$O(n)$
空间复杂度:$O(1)$

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
private:
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        if (head == NULL || head->next == NULL) return head;
        ListNode* newHead = new ListNode(0);
        newHead->next = head;
        ListNode* tail = newHead;
        for (int i=0; i<m-1; ++i)
            tail = tail->next;
        ListNode* revTail = tail->next;
        ListNode* revHead = NULL;
        for (int i=0; i<n-m; ++i) {
            revHead = revTail->next;
            revTail->next = revHead->next;
            revHead->next = tail->next;
            tail->next = revHead;
        }
        // delete the pointer
        ListNode* toDelete = newHead;
        delete toDelete;
        newHead = newHead->next;
        return newHead;
    }
};

广告区域

本人和小伙伴们承接各种软件项目,有需求的可以联系我们。
QQ: 2992073083

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不...
    曲终人散Li阅读 8,627评论 0 19
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,348评论 0 33
  • 转载请注明出处:http://www.jianshu.com/p/c65d9d753c31 在上一篇博客《数据结构...
    Alent阅读 8,820评论 4 74
  • 唇旱欲烈 耗尽最后余留的颓废 暗色情绪漫浸 宅着 放弃思,放空念 已免疫忘我 宅吧!
    日日月月也曾思思念念阅读 689评论 0 0
  • 走进你,却没有发现你, 因为你不在我的视线里; 躺在大地,依然没有感觉到你的存在; 当我翻身抬头的时候,你出现了;...
    心地图阅读 1,787评论 0 2