力扣经典150题第六十题:反转链表 II

简介: 力扣经典150题第六十题:反转链表 II

标题:使用Java实现反转链表 II

在本文中,我们将解决LeetCode上的第六十题,即反转链表 II。题目要求给定一个单链表的头指针head和两个整数left和right,其中left <= right。我们需要反转从位置left到位置right的链表节点,并返回反转后的链表。

1. 题目分析

题目要求反转链表的一部分,这需要我们找到反转的起始位置和结束位置,然后对这一部分进行反转。同时,我们需要考虑边界情况,如链表为空、left等于right等情况。

2. 解题思路

我们可以使用三个指针来处理这个问题:pre、cur、next。具体步骤如下:

  • 首先,找到left位置的前一个节点pre和left位置的节点cur。
  • 然后,将left位置到right位置的节点反转。
  • 最后,将pre的next指针指向反转后的链表头节点,将反转区间的最后一个节点的next指针指向next节点。

3. Java代码实现

class ListNode {
    int val;
    ListNode next;
    ListNode(int val) {
        this.val = val;
    }
}
public class ReverseBetween {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        if (head == null) return null;
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode pre = dummy;
        // 找到left位置的前一个节点pre
        for (int i = 0; i < left - 1; i++) {
            pre = pre.next;
        }
        ListNode cur = pre.next;
        ListNode next;
        // 反转left到right位置的节点
        for (int i = 0; i < right - left; i++) {
            next = cur.next;
            cur.next = next.next;
            next.next = pre.next;
            pre.next = next;
        }
        return dummy.next;
    }
}

4. 测试示例

我们使用几个示例来测试我们的代码:

public class Main {
    public static void main(String[] args) {
        // 示例1
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        ListNode node4 = new ListNode(4);
        ListNode node5 = new ListNode(5);
        node1.next = node2; node2.next = node3; node3.next = node4; node4.next = node5;
        ReverseBetween solution = new ReverseBetween();
        ListNode reversedList1 = solution.reverseBetween(node1, 2, 4);
        printList(reversedList1);
        // 示例2
        ListNode node6 = new ListNode(5);
        ListNode reversedList2 = solution.reverseBetween(node6, 1, 1);
        printList(reversedList2);
    }
    public static void printList(ListNode head) {
        ListNode cur = head;
        while (cur != null) {
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
        System.out.println();
    }

5. 总结

本文介绍了如何使用Java实现反转链表 II。通过使用三个指针,我们可以有效地反转链表的一部分,满足题目的要求。这是一道常见的链表问题,在面试中也经常会被考察到。

public class BlogEnding {
    public static void main(String[] args) {
        encourageEngagement();
    }
    public static void encourageEngagement() {
        System.out.println("🚀 感谢您阅读本文!如果您觉得有收获,请一键三连:点赞 ❤️️、转发 🔁、评论 💬,并加关注哦!");
    }
}


相关文章
|
2月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
38 1
|
2月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
52 0
Leetcode第21题(合并两个有序链表)
|
2月前
|
算法
【链表】算法题(二) ----- 力扣/牛客
【链表】算法题(二) ----- 力扣/牛客
|
2月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
28 0
LeetCode第二十四题(两两交换链表中的节点)
|
2月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
47 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
2月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
96 0
|
2月前
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
23 0
|
2月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
18 0
|
2月前
【LeetCode 08】206 反转链表
【LeetCode 08】206 反转链表
13 0
|
2月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
33 0