反转链表II(力扣 92)Java

简介: 反转链表II(力扣 92)Java

一、题目描述

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


示例 1:

902200c45c40493fb209c277e15e1cf6.png


输入:head = [1,2,3,4,5], left = 2, right = 4

输出:[1,4,3,2,5]


示例 2:

输入:head = [5], left = 1, right = 1

输出:[5]

 

提示:


链表中节点数目为 n

1 <= n <= 500

-500 <= Node.val <= 500

1 <= left <= right <= n


二、思路讲解



较为简单的反转链表题目。定义两个指针prev和next分别指向要翻转部分的前一节点和后一节点,把要翻转的部分翻转后,再接回原链表即可。


如果刚开始就要翻转,这个时候没有前置指针prev怎么办?我们可以引入在链表前面加上一个节点hair,这样依然可以进行一般操作。在操作完之后返回hair.next,即是原链表了。


三、Java代码实现



/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        //在链表最前面加一个节点,方便一开始就要翻转
        ListNode hair = new ListNode(0, head);
        ListNode prev = hair;       //要翻转部分的前一个节点 
        ListNode left2 = head;      //要翻转部分的前节点
        ListNode right2 = head;     //要翻转部分的右节点
        for(int i=0; i<left-1; i++){
            prev = prev.next;
        }
        for(int i=0; i<left-1; i++){
            left2 = left2.next;
        }
        for(int i=0; i<right-1; i++){
            right2 = right2.next;
        }
        ListNode next = right2.next;    //要翻转部分的下一个节点
        //将要翻转的部分翻转
        ListNode nex;
        ListNode pre = left2;
        ListNode p = left2.next;
        while(pre!=right2){
            nex = p.next;
            p.next = pre;
            pre = p;
            p = nex;
        }
        //接回原链表中
        prev.next = right2;
        left2.next = next;
        return hair.next;
    }
}


 

四、时空复杂度分析



时间复杂度:        O(N)        最坏情况下,遍历整个链表


空间复杂度:         O(1)

相关文章
|
3月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
40 1
|
5月前
【bug记录】旋转链表与力扣报错:member access within null pointer of type ‘struct ListNode‘
【bug记录】旋转链表与力扣报错:member access within null pointer of type ‘struct ListNode‘
|
4月前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
3月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
30 3
|
3月前
|
算法
【链表】算法题(二) ----- 力扣/牛客
【链表】算法题(二) ----- 力扣/牛客
|
3月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
102 0
|
3月前
|
算法 Java
LeetCode(一)Java
LeetCode(一)Java
|
3月前
|
算法
【链表】算法题(一) ----- 力扣 / 牛客
【链表】算法题(一) ----- 力扣 / 牛客
|
5月前
|
存储 Java
|
5月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
59 6