zoukankan      html  css  js  c++  java
  • 92. 反转链表 II

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

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

    示例:

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

    思路:

      • 扫描一趟完成,先走到需要反转的地方,记录反转节点的前一个节点为连接节点 con;
      • 反转的第一个节点为 反转链表的尾节点,记为 tail;
      • 在 m ~ n区间反转链表,反转链表结束后,头结点为 pre,下一个正常节点为 cur;
      • 则 con -> pre , tail -> cur,当 m==1时, con为null,需要特殊处理。

    class Solution {
        public ListNode reverseBetween(ListNode head, int m, int n) {
            ListNode pre = null, cur = head;
            while(m > 1){
                pre = cur; //先走到需要反转的地方,记录反转的前一个节点为 pre
                cur = cur.next; //记录需要反转的起始节点为 cur
                m--;
                n--;
            }
            ListNode con = pre, tail = cur; // m == 1时,con == null
            //记录链接节点为 con,反转中的尾节点为 tail
            ListNode tmp = null; //记录反转中的,下一个头结点
            while( n > 0){
                tmp = cur.next;
                cur.next = pre; //反转链表
                pre = cur;
                cur = tmp;
                n--;
            }
            if(con == null) head = pre; //如果连接点为 null 值,更新头结点
            else con.next = pre; //否则,反转节点的头节点,与前面的连接点链接起来
            tail.next = cur; //反转节点的尾节点,连接到剩余节点
            return head;
        }
    }
  • 相关阅读:
    LeeCode 1497. 检查数组对是否可以被 k 整除
    LeetCode 1503. 所有蚂蚁掉下来前的最后一刻
    双指针算法
    最短送餐路程计算, 美团笔试题2020
    最短路算法dijkstra算法
    寻找最小子字符串, 美团笔试题2020
    最大矩形, 统计全1子矩阵
    拼凑硬币, 腾讯
    7月15日
    7月14日
  • 原文地址:https://www.cnblogs.com/luo-c/p/13969988.html
Copyright © 2011-2022 走看看