题目
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]
内 - 0 <= Node.val <= 100
思路
算法:
模拟 O(n)
两两交换 = 两个为一组互相交换
递归法三步:
- 终止条件:只有一个节点时,终止交换
- 本层的操作:交换当前节点与下一个节点
- 返回的值:交换好的子链表
时间复杂度:仅遍历一遍所有结点,所以时间复杂度为 O(n) .
代码
C++代码:
// 递归法
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null) return head;
ListNode node = head;
ListNode next = node.next;
ListNode nextnext = next.next;
next.next = node;
node.next = swapPairs(nextnext);
return next;
}
}
// 迭代法
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
for(ListNode p = dummy;p.next != null && p.next.next != null;){
ListNode a = p.next,b = p.next.next;
p.next = b;
a.next = b.next;
b.next = a;
p = a;
}
return dummy.next;
}
}
python3代码:
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
# iterative
dummy = cur = ListNode(0)
dummy.next = head
while head and head.next:
tmp = head.next
head.next = tmp.next
tmp.next = head
cur.next = tmp
head = head.next
cur = tmp.next
return dummy.next