DSA交换节点对leetcode问题错误

问题描述 投票:0回答:1
   public ListNode swapPairs(ListNode node) {
    ListNode head = node;
    ListNode cur = node;
    while (head != null && head.next != null) {
        head = reverseList(head, 0);
        head.next = cur.next.next;
        head = head.next;
        cur = head;
    }
    return node;
}

public ListNode reverseList(ListNode node, int counter) {
    if (counter == 1 || node == null || node.next == null) {
        return node;
    } else {
        ListNode newHead = reverseList(node.next, counter++);
        node.next.next = node;
        node.next = null;
        return newHead;
    }
}

所以这是一个leetcode问题。

例如,如果给定的链表是 1->2->3->4->5

那么输出应该是2->1->4->3->5。

我看到了正确的解决方案,但我想知道为什么这段代码不起作用。谁能帮我理解这一点吗?

java data-structures linked-list recursive-datastructures
1个回答
0
投票

有很多错误,我无法全部指出。

但是让我告诉你一个概念。

设 A 为链表。

现在当我做 Node c = A.next

这意味着 c 是 A 点右边的下一个元素。

现在如果我让 c=null。

那么A.next也会变成null。

这就是引用变量的概念。

这意味着如果你简单地执行 c=a 。那么 c 和 a 都将指向同一个链接的 lint 对象。

现在如果你想将 a 复制到 c 。你必须创建新节点并将 c 的元素复制到 a 。

现在,回到这里发布的问题。

你基本上可以做两件事。

要么只通过交换来改变链表元素的值。 或者 交换节点。

两者都应该理想地工作。

您的代码的问题是- 以下是代码中错误的简单细分:

  1. reverseList函数的错误使用:

您正在尝试交换对,但您正在使用递归列表反转函数。这不是必需的,因为您只想交换两个节点,而不是反转整个部分。

  1. reverseList 中的 counter++ 问题:

counter++ 是后递增的,这意味着它在递归调用中使用后会增加值,这会阻止停止条件正常工作。

  1. 交换后指针处理不正确:

调用reverseList后,您没有正确连接列表的其余部分。该行 head.next = cur.next.next;可能会破坏列表结构,导致错误的行为。

  1. 不必要的复杂性:

您正在使用递归和单独的函数来反转节点,但您可以直接交换相邻节点,而无需额外的复杂性。

简而言之,主要错误是不正确的递归、不正确的列表处理以及当只需要交换两个节点时使用反转函数。

© www.soinside.com 2019 - 2024. All rights reserved.