Leetcode24. 两两交换链表中的节点(JAVA迭代+递归)

Posted !0 !

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode24. 两两交换链表中的节点(JAVA迭代+递归)相关的知识,希望对你有一定的参考价值。

题目链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs/

解题思路

方法一:迭代

链表的题一般都是用递归或者迭代。我们先用迭代来解决这题。
一般链表题目都会创建头节点方便统一处理,我们用l1来表示要交换的两个节点的前面一个节点,l2表示要交换的两个节点的第一个节点。具体思路看代码,链表的题最好自己动手画图,结合着图来很容易就写出来了。

代码

class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode newHead = new ListNode(-1, head);  //新头节点
        ListNode l1 = newHead;  //两个要交换的节点的前一个节点
        ListNode l2 = l1.next;  //要交换的两个节点的第一个节点
        while(l2 != null && l2.next != null) {
            l2 = l2.next;   //指向要交换的两个节点的第二个节点
            l1.next.next = l2.next; //要交换的两个节点的第一个节点指向要交换的两个节点后面的一个节点
            l2.next = l1.next;  //使第二个节点指向第一个节点
            l1.next = l2;   //使头节点指向交换后的节点
            l1 = l2.next;   //调整位置,使得l1指向两个要交换的节点的前一个节点
            l2 = l1.next;   //调整位置,使得l2指向要交换的两个节点的第一个节点
        }
        return newHead.next;
    }
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

方法二:递归

递归最主要的是找到递归结束条件和递归体部。
一般递归结束条件比较容易找。这题的递归结束条件是链表中只有一个节点或者没有节点。
我们可以用 head 表示原始链表的头节点,新的链表的第二个节点,用 newHead 表示新的链表的头节点,原始链表的第二个节点,则原始链表中的其余节点的头节点是 newHead.next。令 head.next = swapPairs(newHead.next),表示将其余节点进行两两交换,交换后的新的头节点为 head 的下一个节点。然后令 newHead.next = head,即完成了所有节点的交换。最后返回新的链表的头节点 newHead

代码

class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null)
            return head;
        ListNode newHead = head.next;
        head.next = swapPairs(newHead.next);
        newHead.next = head;
        return newHead;
    }
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

以上是关于Leetcode24. 两两交换链表中的节点(JAVA迭代+递归)的主要内容,如果未能解决你的问题,请参考以下文章

[leetcode] 24. 两两交换链表中的节点

LeetCode ——24. 两两交换链表中的节点

leetcode 24 - 两两交换链表中的节点

链表-LeetCode24两两交换链表中的节点

LeetCode 24.两两交换链表中的节点

leetcode 24 两两交换链表中的节点