LeetCode92. 反转链表 II

LeetCode92. 反转链表 II

题目描述

 /**
     *
     * 给你单链表的头指针 head 和两个整数 left 和 right ,
     * 其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,
     * 返回 反转后的链表 。
     *
     */

思路分析

  1. 将一个链表中指定位置的元素反转,其他位置的元素保持不变
  2. 使用变量cur记录当前遍历到的是原始链表的第几个元素
  3. 可以将链表以left和right为界分为三部分,left之前的元素直接连接到新链表,left和right之间的元素通过栈的结构反转,而right之后的元素也直接连接到新链表
  4. 源码见下

源码及分析

 /**
     *
     * @param head 链表头节点
     * @param left 要反转的左侧索引
     * @param right 右侧索引
     * @return 反转后的新链表
     */
    public ListNode reverseBetween(ListNode head, int left, int right) {
        //创建栈用于辅助反转
        Stack<ListNode> stack = new Stack<>();
        //创建新链表
        ListNode dummy = new ListNode();
        //辅助指针用于向链表添加数据
        ListNode tmp = dummy;
        //记录当前是第几个节点
        int cur = 1;
        //先处理前right个元素
        while (cur <= right) {
            //从第left个节点开始,将元素反转,使用栈结构
            if (cur >= left) {
                ListNode node = new ListNode(head.val,null);
                stack.push(node);
            } else {
                //left之前的元素直接连接到新链表
                tmp.next = head;
                tmp = tmp.next;
            }
            //head指针后移
            head = head.next;
            cur++;
        }
        //将栈中反转的元素连接到新链表的后面
        while (!stack.isEmpty()) {
            tmp.next = stack.pop();
            tmp = tmp.next;
        }
        //将right之后的元素连接到链表
        while (head != null) {
            tmp.next = head;
            tmp = tmp.next;
            head = head.next;
        }
        return dummy.next;
    }
posted @ 2021-06-17 09:30  mx_info  阅读(70)  评论(0)    收藏  举报