24. 两两交换链表中的节点 - 力扣(LeetCode)
- 递归确实np
cpp
复制代码
ListNode* swapPairs(ListNode* head) {
if(head == nullptr || head->next == nullptr)
return head;
ListNode* p1 = head;
ListNode* p2 = head->next;
p1->next = swapPairs(p2->next);
p2->next = p1;
return p2;
}
- 迭代法--难搞
cpp
复制代码
ListNode* swapPairs(ListNode* head) {
if(head == nullptr || head->next == nullptr)
return head;
ListNode* p1 = head;
ListNode* p2 = p1->next;
ListNode* p3 = p2->next;
//p1->next = p3;
//p2->next = p1;
ListNode* ret = p2;
ListNode* tail = p1;
while(p3 && p3->next)
{
tail = p1;
p1->next = nullptr;
p2->next = p1;
p1 = p3;
p2 = p3->next;
p3 = p2->next;
tail->next = p2;
}
tail->next = p2;
p1->next = p3;
p2->next = p1;
return ret;
}