方法一
一、思路
递归
二、解题方法
用 head 表示原始链表的头节点,新的链表的第二个节点,用 newHead 表示新的链表的头节点,原始链表的第二个节点,则原始链表中的其余节点的头节点是 newHead.next。令 head.next = swapPairs(newHead.next),表示将其余节点进行两两交换,交换后的新的头节点为 head 的下一个节点。然后令 newHead.next = head,即完成了所有节点的交换。最后返回新的链表的头节点 newHead。
三、code
class Solution {//定义了一个名为Solution的类
public://表示接下来的成员函数是公共的
ListNode* swapPairs(ListNode* head) {//定义了一个名为swapPairs的成员函数,它接受一个指向ListNode类型的指针head作为参数,并返回一个指向ListNode类型的指针
if (head == nullptr || head->next == nullptr) {//如果head为空或者head下一个节点为空,则返回head
return head;
}
ListNode* newHead = head->next;//定义了一个名为newHead的指针,他指向head的下一个节点
head->next = swapPairs(newHead->next);//将head的下一个节点指向swapPairs函数返回值,newHead的下一个节点变为head的下一个节点
newHead->next = head;//将newHead的下一个节点指向head
return newHead;//返回新链表的头结点
}
};
方法二
一、思路
迭代
二、解题方法
如果 temp 的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得 temp 后面的两个节点 node1 和 node2,通过更新节点的指针关系实现两两交换节点。
具体而言,交换之前的节点关系是 temp -> node1 -> node2,交换之后的节点关系要变成 temp -> node2 -> node1。再令 temp = node1,对链表中的其余节点进行两两交换,直到全部节点都被两两交换。
两两交换链表中的节点之后,新的链表的头节点是 dummyHead.next,返回新的链表的头节点即可。
三、code
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyHead=new ListNode(0); //创建哑节点
dummyHead->next=head;
ListNode* temp=dummyHead;
while (temp->next !=nullptr &&temp->next->next !=nullptr){
ListNode* node1=temp->next;
ListNode* node2=temp->next->next;
temp->next=node2;
node1->next=node2->next;
node2->next=node1;
temp=node1;
}
return dummyHead->next;
}
};