[LeetCode] Reverse Linked List II 倒置链表之二

[LeetCode] Reverse Linked List II 倒置链表之二

大家好,又见面了,我是全栈君。

Reverse a linked list from position m to n. Do it in-place and in one-pass.

For example:
Given 1->2->3->4->5->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given mn satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.

很奇怪为何没有倒置链表之一,就来了这个倒置链表之二,不过猜也能猜得到之一就是单纯的倒置整个链表,而这道作为延伸的地方就是倒置其中的某一小段。对于链表的问题,根据以往的经验一般都是要建一个dummy node,连上原链表的头结点,这样的话就算头结点变动了,我们还可以通过dummy->next来获得新链表的头结点。这道题的要求是只通过一次遍历完成,就拿题目中的例子来说,变换的是2,3,4这三个点,那么我们可以先取出2,用front指针指向2,然后当取出3的时候,我们把3加到2的前面,把front指针前移到3,依次类推,到4后停止,这样我们得到一个新链表4->3->2, front指针指向4。对于原链表连说,有两个点的位置很重要,需要用指针记录下来,分别是1和5,因为当2,3,4被取走时,原链表就变成了1->5->NULL,要把新链表插入的时候需要这两个点的位置。1的位置很好找,因为知道m的值,我们用pre指针记录1的位置,5的位置最后才能记录,当4结点被取走后,5的位置需要记下来,这样我们就可以把倒置后的那一小段链表加入到原链表中。代码如下:

/**
 * 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 *dummy = new ListNode(-1);
        dummy->next = head;
        ListNode *cur = dummy;
        ListNode *pre, *front, *last;
        for (int i = 1; i <= m - 1; ++i) cur = cur->next;
        pre = cur;
        last = cur->next;
        for (int i = m; i <= n; ++i) {
            cur = pre->next;
            pre->next = cur->next;
            cur->next = front;
            front = cur;
        }
        cur = pre->next;
        pre->next = front;
        last->next = cur;
        return dummy->next;
    }
};

本文转自博客园Grandyang的博客,原文链接:倒置链表之二[LeetCode] Reverse Linked List II ,如需转载请自行联系原博主。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107861.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 教大家一个可以用迅雷全速下载百度网盘文件的方法「建议收藏」

    教大家一个可以用迅雷全速下载百度网盘文件的方法「建议收藏」本帖最后由古道吹西风于2017-8-2822:11编辑 百度的各种限制,相信大家都是苦难言,每年赚那么多的钱,还这样小气,开通会员也一样的下载慢,我只说“我去年买了个表”这个方法网上有教程,大家也可以去网上搜一下,先看一下我家的网速,小区宽带6M 再看看下载速度 是不是全速,方法如下1.下载tampermonkey,这个google浏览器插件,插件可以去百度搜索下载。如下图 2.上传完…

    2022年10月8日
    2
  • python输出图像通道数_python查看图片通道数

    python输出图像通道数_python查看图片通道数如果你只想获得图像的行数和列数,行数代表图像的高,列数代表图像的宽。如下src=cv.imread(“xxxxx”)读取图片image=src.shape获取图片宽高及通道数rows=image[0]cols=image[1]src.shape返回值为:(rows,cols,通道数)所以image[3]就是通道数tongdao_nums=image[3]…

    2025年10月28日
    4
  • 汇微商app v4.0.1官方iPhone版

    汇微商app v4.0.1官方iPhone版微信加粉完全免费,分行业类别,精确加粉,自动匹配筛选,拒绝僵尸粉,让你彻底解决烦恼。

    2022年5月16日
    41
  • 几种字符乱码

    几种字符乱码其他编码转成iso8859-1出现乱码?(问号):   原因:是因为iso8859-*的处理逻辑,对不存在的的码值直接解析为?号(0x3F)  演示://控制台设置为iso8859-1,输出一个左手图标”☜”,控制台显示乱码System.out.println(‘\u261c’);   解决:   处理好不同编码,iso是西欧用的比较多的编码,如果

    2022年6月7日
    35
  • 数据库的五种索引类型[通俗易懂]

    数据库的五种索引类型[通俗易懂]本文从如何建立mysql索引以及介绍mysql的索引类型,再讲mysql索引的利与弊,以及建立索引时需要注意的地方首先:先假设有一张表,表的数据有10W条数据,其中有一条数据是nickname=’css’,如果要拿这条数据的话需要些的sql是SELECT*FROMawardWHEREnickname=’css’一般情况下,在没有建立索引的时候,mysql需要扫描全表及扫描1…

    2022年4月28日
    76
  • Redis之压缩列表ziplist

    Redis是基于内存的nosql,有些场景下为了节省内存redis会用“时间”换“空间”。ziplist就是很典型的例子。ziplist是list键、hash键以及zset键的底层实现之一(3.0之后list键已经不直接用ziplist和linkedlist作为底层实现了,取而代之的是quicklist)这些键的常规底层实现如下:list键:双向链表 hash键:字典di…

    2022年4月9日
    80

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号