• 92. 反转链表 II


    反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
     
    说明:
    1 ≤ m ≤ n ≤ 链表长度。
     
    示例:
    输入: 1->2->3->4->5->NULL, m = 2, n = 4
    输出: 1->4->3->2->5->NULL
     
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
     
     
    寻找关键的节点
     
     
    找到开始逆置的节点,记录该节点的前驱和该节点
     
    从 head 开始,逆置 change_len = n-m+1 个节点
     
    将 pre_head 与 new_head连接,modify_list_tail 与 head 连接
     
     
     1 struct ListNode {
     2     int val;
     3     ListNode *next;
     4     ListNode(int x) : val(x), next(NULL) {}
     5 };
     6 
     7 class Solution {
     8 public:
     9     ListNode* reverseBetween(ListNode* head, int m, int n) {
    10         int change_len = n - m + 1;
    11         ListNode *pre_head = NULL;//需要逆置的头节点的前驱
    12         ListNode *result = head;
    13         
    14         while (head && --m) {//m-1 次
    15             pre_head = head;//记录当前头节点
    16             head = head->next;
    17         }//head >>需要逆置的头节点
    18         ListNode *modify_list_tail = head;//记录初始逆置的头节点,也就是逆置后的尾部
    19         ListNode *new_head = NULL;//逆置后的头节点
    20         while (head && change_len) {
    21             ListNode *next = head->next;
    22             head->next = new_head;
    23             new_head = head;
    24             head = next;//最后一次 head 指向逆置段的后一个节点
    25             --change_len;//只逆置 change_len 个节点
    26         }
    27         modify_list_tail->next = head;//逆置段的尾部指向下一个节点
    28         if (pre_head) {
    29             pre_head->next = new_head;//逆置段的前一个节点指向
    30         } else {
    31             // pre_head = new_head; ❌
    32 //             特殊情况: m=1 从第一个节点开始逆置,result存放的就是头节点,所以 result 需要变成逆置后的头节点
    33              result = new_head;
    34         }
    35         return result;
    36     }
    37 };
    测试

     1 int main(int argc, const char * argv[]) {
     2     ListNode a(1);
     3     ListNode b(2);
     4     ListNode c(3);
     5     ListNode d(4);
     6     ListNode e(5);
     7     a.next = &b;
     8     b.next = &c;
     9     c.next = &d;
    10     d.next = &e;
    11     Solution solve;
    12     ListNode *head = solve.reverseBetween(&a, 2, 4);
    13     while (head) {
    14         cout <<head->val<<endl;
    15         head = head->next;
    16     }
    17     
    18     return 0;
    19 }
    View Code
     

  • 相关阅读:
    实现选中复制时不触发点击事件
    git忽略文件权限
    ubuntu 多版本php
    you have held broken packages
    linux ifconfig ip地址错误
    linux 系统设置屏幕分辨率
    linux addr2line 用于定位程序崩溃使用
    启动报Interrupted function call:accept failed
    系统下载网站
    1 什么是Lambda表达式 look
  • 原文地址:https://www.cnblogs.com/i-8023-/p/11825579.html
Copyright © 2020-2023  润新知