我正在尝试实现代码以交换链表中的两个相邻对,并且在理解我的错误所在时遇到了一些麻烦。
这是针对使用Java编程语言实现的leetcode问题,我首先尝试了一种迭代解决方案,在该解决方案中,我分配了第一个初始节点和第三个初始节点,然后迭代每2个切换一次的所有节点。我的第二次尝试是一个基本案例的递归解决方案,检查是否存在0或1个节点。然后我交换了前2个节点,然后遍历链表的其余部分,然后加入链表。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || (head.next == null)){return head;}
//first we swap the first node and the second node
ListNode first = head;
ListNode third = head.next.next;
first.next.next = first;
first.next = third;
//then we recurse on part of the linked list
ListNode recursedList = swapPairs(head.next.next);
//we join these two linked lists together
first.next.next = recursedList;
//and finally we return the head
return head;
}
}
用于示例输入
[1,2,3,4]解决方案是
[2,1,4,3]但我的解决方案得出[1,3,4]。我的代码在哪里存在逻辑缺陷?
答案 0 :(得分:0)
相信这只是一个简单的错误。
output_notebook
这对于链表中偶数和奇数节点的情况都应适用。
主要错误是您在交换第一个节点和第三个节点,而不是第一个和第二个节点(不是相邻对)。同样,诸如public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null) { return head; }
# swapping the first and second
ListNode second = new ListNode(head.val);
ListNode first = new ListNode(head.next.val);
first.next = second;
# recursively swap the next 2 items in the linked list till the end of list
ListNode recursedList = swapPairs(head.next.next);
first.next.next = recursedList;
return first;
}
之类的赋值仅进行浅拷贝。这意味着如果您要尝试以下操作...
ListNode first = head;
...您会发现首先更改 也会更改 head ,并且获得的打印结果如下:
printLinkedList(head); # function to print out the entire linked list
ListNode first = head;
first.val = 100;
first.next = head.next.next.next;
printLinkedList(head);
答案 1 :(得分:0)
另一种方法
public ListNode swapPairs(ListNode head) {
if ((head == null)||(head.next == null))
return head;
ListNode n = head.next;
head.next = swapPairs(head.next.next);
n.next = head;
return n;
}