原理
本题采用递归的思想来解决两两交换链表节点的问题。整体思路是从链表头开始,每次处理两个相邻的节点,将它们的顺序进行交换,然后递归地对后续的链表部分继续进行同样的两两交换操作,直到整个链表的节点都按要求交换完毕。利用一个虚拟头节点可以更方便地处理链表表头节点交换的边界情况,使得代码逻辑更加简洁统一。
步骤
-
边界情况判断(
if(!head ||!head->next) return head;
部分)
首先判断链表是否为空(head
为nullptr
)或者链表只有一个节点(head->next
为nullptr
),如果满足这两种情况之一,说明不需要进行节点交换操作,直接返回原链表头指针head
。 -
创建虚拟头节点并初始化(
ListNode* newHead = new ListNode(0);
和newHead = head->next;
部分)
创建一个值为 0 的虚拟头节点newHead
,其初始目的是为了简化链表节点交换时的操作,避免对原表头节点单独处理的复杂性。然后将newHead
指向原链表头节点head
的下一个节点,因为要进行两两交换,先确定新的头节点(交换后的第一个节点)就是原链表中的第二个节点。 -
递归交换后续节点并重新连接链表(
head->next = swapPairs(newHead->next);
和newHead->next = head;
部分)- 通过
head->next = swapPairs(newHead->next);
这一语句,递归地对原链表中第二个节点(当前newHead
所指向的节点)之后的链表部分进行两两交换操作,并将交换后的链表头指针重新连接到当前第一个节点(原链表的head
节点)的next
指针上,这样就完成了后半部分链表交换后的正确连接。 - 接着使用
newHead->next = head;
将原链表的第一个节点(
- 通过