返回

刷题攻略:反转链表 II,炼就算法硬实力

后端

提起算法题,很多程序员都避之不及,认为算法题太难、太烧脑,自己肯定做不来。其实,算法题并没有想象的那么难,只要掌握了正确的学习方法,再加上持之以恒的练习,你也可以成为算法高手。

今天,我们就以六六力扣的反转链表 II题目为例,带大家一起学习链表反转的算法原理和实现步骤,帮助你掌握链表反转的技巧,提升算法编程能力。

题目

反转链表 II

给定一个链表,反转链表中的第 m 个节点到第 n 个节点之间的节点。

示例:

给定 m = 2, n = 4,

1->2->3->4->5

返回:

1->4->3->2->5

算法原理

反转链表 II的算法原理很简单,可以概括为以下三个步骤:

  1. 找到要反转的链表的起始节点和结束节点。
  2. 将起始节点和结束节点之间的所有节点反转。
  3. 将反转后的链表重新连接到原链表。

实现步骤

下面,我们就以Java语言为例,详细讲解反转链表 II算法的实现步骤:

/**
 * 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 m, int n) {
        // 如果链表为空,或者m和n相等,则直接返回链表。
        if (head == null || m == n) {
            return head;
        }

        // 找到要反转的链表的起始节点和结束节点。
        ListNode preHead = new ListNode(0);
        preHead.next = head;
        ListNode prev = preHead;
        for (int i = 1; i < m; i++) {
            prev = prev.next;
        }
        ListNode start = prev.next;
        ListNode end = start;
        for (int i = m; i < n; i++) {
            end = end.next;
        }

        // 将起始节点和结束节点之间的所有节点反转。
        ListNode next = end.next;
        end.next = null;
        ListNode newHead = reverseList(start);
        prev.next = newHead;
        start.next = next;

        // 返回反转后的链表。
        return preHead.next;
    }

    // 反转链表的辅助函数。
    private ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;
        while (curr != null) {
            ListNode next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
}

结语

掌握了链表反转的技巧,你就可以轻松解决六六力扣的反转链表 II题目,也能更好地理解链表的结构和操作。希望你能继续努力,不断练习,争取成为算法高手!