美文网首页
链表指定起始终点反转(Leetcode92)

链表指定起始终点反转(Leetcode92)

作者: zhouwaiqiang | 来源:发表于2018-11-11 21:12 被阅读0次

题目

  • 给定一个链表,使其从m位置到n位置的链表进行反转,一次通过,链表的长度是在1<=m<=n<=链表长度
  • 举例:给定链表1->2->3->4->5->NULL,m=2,n=4返回的应该是1->4->3->2->5->NULL

解题思路

  • 只需要一次遍历该链表,同时对链表计数count,如果count值在m和n之间表示这一段节点都是需要反转
  • 需要反转的部分我们可以采用头插法实现一边遍历一边反转
  • 头插法需要考虑几个问题:我们需要找到m节点的前一个节点,如果m=1那么就是head就要开始反转,所以我在原始链表中增加一个front节点可以保证无论m是哪个值都可以实现链表节点反转
  • 其次,m节点反转后是作为这一段反转节点的末尾,这时候是需要续接后面的节点,所以当遍历到count==m时,就采用一个遍历将这个链表变量reverseLast进行暂存,方便之后使用。
  • 最后,关于reverseLast的next有两种情况,倘若n==链表长度,那么只需要指向NULL,但是如果n<链表长度,那么reverseLast的next需要指向后续的原始链表。
  • 因为没有使用太多额外空间,空间复杂度为O(1)
  • 也可以采用完全开辟一个新链表的方法,即是我对原始链表遍历,同时根据条件将原始链表的值创建到新链表中,但是这样会使用O(n)的空间。

解题源代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode front = new ListNode(0);
        front.next = head;
        ListNode pre = front, index = head;//index用于遍历,pre用于表示反转链表m的前一个链表节点
        ListNode reverseLast = null;//反转链表后的最后一个节点,也是反转前的第一个链表指针
        int count = 0;
        while (index != null) {
            count++;
            if (count == m) {
                reverseLast = index;//暂存
                ListNode temp = index;
                index = index.next;
                temp.next = null;
                pre.next = temp;
                continue;
            }
            if (count < m) {
                pre = index;//更新父节点
            }
            //采用头插法实现反转
            if (count > m && count <= n) {
                ListNode temp = index;
                index = index.next;
                temp.next = pre.next;
                pre.next = temp;
                continue;
            }
            if (count == n+1) {
                reverseLast.next = index;
                break;
            }
            index = index.next;
        }
        return front.next;
    }
}

相关文章

  • 链表指定起始终点反转(Leetcode92)

    题目 给定一个链表,使其从m位置到n位置的链表进行反转,一次通过,链表的长度是在1<=m<=n<=链表长度 举例:...

  • Leetcode(链表题解)

    Leetcode_206 反转链表 Leetcode_203 删除链表中指定的元素 Leetcode_24 链表元...

  • 单链表反转问题

    基本问题 如何将单链表反转? 单链表结构定义 算法实现 进阶问题 如何将单链表在指定区间内进行反转? 问题分析 这...

  • 数据结构和算法面试

    1、双链表指定节点后插入一个节点、删除指定节点。 2、链表反转。 3、二分查找 4、赫夫曼编码原理 5、队列和栈的...

  • Algorithm小白入门 -- 单链表

    单链表递归反转链表k个一组反转链表回文链表 1. 递归反转链表 单链表节点的结构如下: 1.1 递归反转整个单链表...

  • 链表反转

    循环反转链表 递归反转链表

  • 反转链表的指定区域

    /* @lc app=leetcode.cn id=92 lang=java [92] 反转链表 II https...

  • 5个链表的常见操作

    链表 链表反转 LeetCode206:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 环路检...

  • JZ-015-反转链表

    反转链表 题目描述 输入一个链表,反转链表后,输出新链表的表头。题目链接: 反转链表[https://www.no...

  • 算法学习(链表相关问题)

    LeetCode 206 反转链表 LeetCode 92 反转链表II (练习) 完成,方法:在反转链表上改 L...

网友评论

      本文标题:链表指定起始终点反转(Leetcode92)

      本文链接:https://www.haomeiwen.com/subject/dcyffqtx.html