LeetCode:24. 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 :
输入:head = [1,2,3,4]
输出:[2,1,4,3]
这道题最好的方式便是用递归,当然迭代方式也可以,但是需要判断的条件会更多。
我这道题的思路:有链表old = A—>B—>C—>D。
1.定义新链表指向第二个节点:new = B—>C—>D。
2.新链表的第二个节点,也就是老链表的第三个节点开始进入递归计算,得到:new = B—>D—>C。
3.老链表头节点指向新链表第二个节点:old = A—>D—>C。
4.新链表头节点指向老链表头节点:B—>A—>D—>C。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode swapPairs(ListNode head) { if(head==null || head.next==null){ return head; } //新链表头节点是老链表第二个节点 ListNode newHead = head.next; //新链表第二个节点,也就是老链表第三个节点,进入递归。 newHead.next = swapPairs(newHead.next); //老链表头节点指向新链表第二个节点。 head.next = newHead.next; //新链表头节点指向老链表头节点 newHead.next = head; return newHead; } }
时间复杂度:O(n),空间复杂度:O(n)
后面看了官方解法,果然更少的步骤,更优雅的代码,也贴上。
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; } }
官方的步骤:
有链表old = A—>B—>C—>D。
1.新链表头节点是老链表第二个节点:new = B—>C—>D。
2.老链表直接指向新链表第二个节点,也就是老链表第三个节点,进入递归:old = A—>D—>C。
3.新链表头节点指向老链表头节点:new = B—>A—>D—>C。