如何使用递归在链表中成对交换节点?

时间:2019-06-13 21:34:48

标签: java recursion linked-list

我正在尝试实现代码以交换链表中的两个相邻对,并且在理解我的错误所在时遇到了一些麻烦。

这是针对使用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]。我的代码在哪里存在逻辑缺陷?

2 个答案:

答案 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;
}