• LeetCode(92):反转链表 II


    Medium!

    题目描述:

    反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

    说明:
    1 ≤ m ≤ n ≤ 链表长度。

    示例:

    输入: 1->2->3->4->5->NULL, m = 2, n = 4
    输出: 1->4->3->2->5->NULL

    解题思路:

    根据以往的经验一般都是要建一个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的位置需要记下来,这样我们就可以把倒置后的那一小段链表加入到原链表中。

    C++解法一:

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode *reverseBetween(ListNode *head, int m, int n) {
    12         ListNode *dummy = new ListNode(-1);
    13         dummy->next = head;
    14         ListNode *cur = dummy;
    15         ListNode *pre, *front, *last;
    16         for (int i = 1; i <= m - 1; ++i) cur = cur->next;
    17         pre = cur;
    18         last = cur->next;
    19         for (int i = m; i <= n; ++i) {
    20             cur = pre->next;
    21             pre->next = cur->next;
    22             cur->next = front;
    23             front = cur;
    24         }
    25         cur = pre->next;
    26         pre->next = front;
    27         last->next = cur;
    28         return dummy->next;
    29     }
    30 };
  • 相关阅读:
    RCU介绍
    采用dlopen、dlsym、dlclose加载动态链接库
    linux获取系统启动时间
    Linux获取进程执行时间
    linux下获取硬盘使用情况
    linux下判断文件和目录是否存在
    孤儿进程与僵尸进程
    多个文件目录下Makefile的写法
    System V 共享内存区
    Posix共享内存区
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9159570.html
Copyright © 2020-2023  润新知