给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]
内 0 <= Node.val <= 100
解法一:迭代法
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* swapPairs(struct ListNode* head) {
if (head == NULL || head->next == NULL) { //解决头节点为空
return head;
}
struct ListNode* preprev = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* prev = preprev;
struct ListNode* p = head, * q;
while (p != NULL && q != NULL) { //判断停止条件
q = p->next;
if (q == NULL) {
break;
}
p->next = q->next; //交换节点
q->next = p;
prev->next = q;
prev = p;
p = p->next;
}
return preprev->next;
}
时间复杂度:O(n) 空间复杂度O(n)
解法二:递归法
struct ListNode* swapPairs(struct ListNode* head) {
if (head == NULL || head->next == NULL) { //终止时返回节点
return head;
}
struct ListNode* NewHead = head->next; //新节点
head->next = swapPairs(NewHead->next); //递归传入新节点的下一个
NewHead->next = head; //新节点指向头节点
return NewHead;
}
时间复杂度:O(n) 空间复杂度O(1)