题目描述:
解法:
1.迭代
思路:将两个节点操作看为一步,让前驱节点指向后驱节点的下一节点,后驱节点指向前驱节点,以及前驱结点的前一节点指向后驱节点,达到交换节点的目的。条件是前驱结点和后驱节点都不为空。
代码:
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dump = new ListNode(-1); //哑节点指向该链表
dump->next = head;
ListNode* temp = dump;
while (temp->next != nullptr && temp->next->next != nullptr) {
ListNode* first = temp->next;
ListNode* second = first->next;
first->next = second->next; //前驱节点first指向second->next
second->next = first; //后驱节点指向前驱节点
temp->next = second;
temp = first;
}
return dump->next;
}
}
2.遍历
思路:终止条件是 first 或 head->next 为 nullptr ,此时只有一个或没有节点,无法再进行交换。调用单元是 head 指向交换后的子链表,head->next 指向 head,然后返回 head->next。
代码:
ListNode* swapPairs(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return head;
}
ListNode* first = head;
ListNode* second = head->next;
first->next = swapPairs(second->next);
second->next = first;
return second;
}