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。
我看到了正确的解决方案,但我想知道为什么这段代码不起作用。谁能帮我理解这一点吗?
有很多错误,我无法全部指出。
但是让我告诉你一个概念。
设 A 为链表。
现在当我做 Node c = A.next
这意味着 c 是 A 点右边的下一个元素。
现在如果我让 c=null。
那么A.next也会变成null。
这就是引用变量的概念。
这意味着如果你简单地执行 c=a 。那么 c 和 a 都将指向同一个链接的 lint 对象。
现在如果你想将 a 复制到 c 。你必须创建新节点并将 c 的元素复制到 a 。
现在,回到这里发布的问题。
你基本上可以做两件事。
要么只通过交换来改变链表元素的值。 或者 交换节点。
两者都应该理想地工作。
您的代码的问题是- 以下是代码中错误的简单细分:
您正在尝试交换对,但您正在使用递归列表反转函数。这不是必需的,因为您只想交换两个节点,而不是反转整个部分。
counter++ 是后递增的,这意味着它在递归调用中使用后会增加值,这会阻止停止条件正常工作。
调用reverseList后,您没有正确连接列表的其余部分。该行 head.next = cur.next.next;可能会破坏列表结构,导致错误的行为。
您正在使用递归和单独的函数来反转节点,但您可以直接交换相邻节点,而无需额外的复杂性。
简而言之,主要错误是不正确的递归、不正确的列表处理以及当只需要交换两个节点时使用反转函数。