本题采用虚拟头结点的方法对相邻两结点进行交换。具体步骤如下
第一步:将操作指针指向要交换的第二个结点(在此之前要保存第一个结点的地址,否则改变前一个结点指向第一个结点将无法寻址)
ListNode tmp=cur->next;
cur->next=cur->next->next;
第二步:改变第二个结点的指向(在此之前要保存第三个结点的地址,否则改变前一个结点指向第三个结点将无法寻址)
ListNode* tmp1 = cur->next->next->next;
cur->next->next=tmp;
第三步:改变第一个结点的指向
cur->next->next->next = tmp1;
三步完成之后:
再继续将要操作的cur移动到下一组要交换结点的前一个,进行上述操作即可
具体代码实现如下:
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummy = new ListNode();
dummy->next = head;
ListNode* cur = dummy;
while (cur->next!=nullptr&&cur->next->next!=nullptr)
{
ListNode* tmp = cur->next;
ListNode* tmp1 = cur->next->next->next;
cur->next = cur->next->next;
cur->next->next = tmp;
cur->next->next->next = tmp1;
cur = cur->next->next;
}
return dummy->next;
}
};