题目
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入: head = [1,2,3,4]
输出: [2,1,4,3]
题解
方式一:迭代
复杂度:O(n) 创建一个虚拟节点,需要用指针记录后面的两个节点用于交换它们
public ListNode swapPairs(ListNode head) {
ListNode dummyHead = new ListNode(0, head);
ListNode temp = dummyHead;
while (temp.next != null && temp.next.next != null) {
ListNode node1 = temp.next;
ListNode node2 = temp.next.next;
temp.next = node2;
node1.next = node2.next;
node2.next = node1;
temp = node1;
}
return dummyHead.next;
}
方式二:递归
复杂度:O(n)
好难想...
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;
}
总结
算法:迭代
、递归