Java 反转部分单向链表

发布于 2023-10-08 07:51:04 字数 2810 浏览 38 评论 0

可以使用迭代的方式来反转部分单向链表。

具体步骤如下:

  1. 首先,根据给定的起始位置和结束位置,找到需要反转的起始节点 startNode 和结束节点 endNode ,以及它们前面的节点 prevStartNodeprevEndNode
  2. 定义两个指针变量 prevcurrent ,分别指向 startNodeendNode
  3. 进行反转操作,将 current 指向节点的 next 指针指向前一个节点 prev 。然后将 prevcurrent 都往后移动一位。
  4. 重复步骤 3,直到 current 指向 endNode ,完成反转操作。
  5. 最后,将 prevStartNodenext 指针指向 endNode ,将 startNodenext 指针指向 prevEndNode

下面是对应的 Java 代码实现:

public class ListNode {
    int val;
    ListNode next;

    public ListNode(int val) {
        this.val = val;
    }
}

public class ReversePartialLinkedList {
    public static ListNode reverseBetween(ListNode head, int m, int n) {
        // 使用一个 dummy 节点方便处理边界情况
        ListNode dummy = new ListNode(0);
        dummy.next = head;

        // 找到需要反转的起始节点和结束节点,以及它们的前面节点
        ListNode prevStartNode = dummy;
        ListNode prevEndNode;
        for (int i = 1; i < m; i++) {
            prevStartNode = prevStartNode.next;
        }
        ListNode startNode = prevStartNode.next;
        ListNode current = startNode;
        for (int i = m; i < n; i++) {
            current = current.next;
        }
        ListNode endNode = current;
        prevEndNode = current.next;

        // 反转操作
        ListNode prev = null;
        current = startNode;
        while (current != endNode) {
            ListNode next = current.next;
            current.next = prev;
            prev = current;
            current = next;
        }
        current.next = prev;

        // 重新连接反转后的链表
        prevStartNode.next = endNode;
        startNode.next = prevEndNode;

        // 返回头节点
        return dummy.next;
    }

    public static void main(String[] args) {
        // 创建一个示例链表:1 -> 2 -> 3 -> 4 -> 5
        ListNode head = new ListNode(1);
        head.next = new ListNode(2);
        head.next.next = new ListNode(3);
        head.next.next.next = new ListNode(4);
        head.next.next.next.next = new ListNode(5);

        // 反转链表的第 2 个节点到第 4 个节点(包括第 2 个和第 4 个节点)
        ListNode reversed = reverseBetween(head, 2, 4);

        // 输出反转后的链表:1 -> 4 -> 3 -> 2 -> 5
        ListNode node = reversed;
        while (node != null) {
            System.out.print(node.val + " -> ");
            node = node.next;
        }
        System.out.println("null");
    }
}

以上代码会输出:

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

即将原链表的第 2 个节点到第 4 个节点部分反转后的结果。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

远昼

暂无简介

文章
评论
28 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文