[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)
上一篇 2022年3月12日 下午1:00
下一篇 2022年3月12日 下午1:00


相关推荐

  • IDEA Eval Reset 使用方法

    IDEA Eval Reset 使用方法IDEAEvalRese 使用方法 ideaevalrese 使用方法安装插件离线安装方式 1 下载插件下载地址 https plugins zhile io files ide eval resetter 2 1 6 zip2 安装插件直接下载插件 zip 包 macOS 可能会自动解压 然后把 zip 包丢进回收站 通常可以直接把 zip 包拖进 IDE 的窗口来进行插件的安装

    2026年3月27日
    3
  • centos 7-aarch64如何替换yum源「建议收藏」

    centos 7-aarch64如何替换yum源「建议收藏」一、进入yum.repo.d[root@node-01~]#cd/etc/yum.repos.d/[root@node-01yum.repos.d]#lsCentOS-Base.repoCentOS-Sources.repo二、备份原yum源[root@node-01yum.repos.d]#mkdiryum-back[root@node-01yu…

    2026年4月13日
    5
  • 布隆过滤器的原理,使用场景和注意事项有哪些_布隆过滤器的基本工作原理

    布隆过滤器的原理,使用场景和注意事项有哪些_布隆过滤器的基本工作原理目录什么是布隆过滤器实现原理为啥不用HashMap的问题布隆过滤器数据结构支持删除么如何选择哈希函数个数和布隆过滤器长度最佳实践Redis大Value拆分参考资料什么是布隆过滤器本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilisticdatastructure),特点是高效地插入和查询,可以用来告诉你“某样东西一定不存在或者可能存在”。相比于传统的List、Set、Map等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。实现

    2026年4月16日
    7
  • phpstome2021.5.1 激活码(最新序列号破解)[通俗易懂]

    phpstome2021.5.1 激活码(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    45
  • html 刷新页面,javascript刷新页面的几种方法

    html 刷新页面,javascript刷新页面的几种方法JavaScript 中可以使用 location reload location replace location history go 0 等方法手动刷新 也可以通过设定刷新时间来实现自动刷新 JavaScript 页面刷新的方法介绍 1 reload 方法该方法强迫浏览器刷新当前页面 语法 location reload bForceGet 参数 bForceGet 可选参数 默认为

    2026年3月19日
    2
  • Idea Claude插件无法加载模型怎么办?

    Idea Claude插件无法加载模型怎么办?

    2026年3月12日
    2

发表回复

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

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