zoukankan      html  css  js  c++  java
  • [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节点。。

    1. 由于只翻转指定区域,分析受影响的区域为第m-1个和第n+1个节点
    2. 找到第m个节点,使用for循环n-m次,使用经典反转算法中的链表翻转方法
    3. 处理第m-1个和第n+1个节点
    4. 返回dummy->next
    /**
     * 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) {
            if (head == nullptr || m > n) 
                return head;
            ListNode* dummy = new ListNode(0);
            dummy->next = head;
            ListNode* node = dummy;
            for (int i = 1; i != m; i++) {
                if (node == nullptr)
                    return node;
                else
                    node = node->next;
            }  
            ListNode* premNode = node;
            ListNode* mNode = node->next;
            ListNode* nNode = mNode;
            ListNode* postnNode = nNode->next;
            for (int i = m; i != n; i++) {
                ListNode* tmp = postnNode->next;
                postnNode->next = nNode;
                nNode = postnNode;
                postnNode = tmp;
            }
            premNode->next = nNode;
            mNode->next = postnNode;
            
            return dummy->next;
        }
    };
    // 6 ms
  • 相关阅读:
    C++怎么实现线程安全
    Linux内核之进程地址空间
    Linux内核之内存管理
    内存管理之内存寻址
    Linux内核初探
    进程间通信
    下拉列表控件实例 ComboBoxControl
    数据表格控件 DataGridControl
    8 种百度云高速下载,你值得拥有
    10 快好用的下载工具,终于和迅雷说拜拜了
  • 原文地址:https://www.cnblogs.com/immjc/p/7779011.html
Copyright © 2011-2022 走看看