题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目解析
首先可以特判一下,如果结点数目小于等于1,则直接返回即可,因为数目小于等于1就不需要交换了。
然后我们可以创建一个虚拟的头结点,然后如图所示定义几个结点指针,经过图中的顺序进行交换结点,然后将结点依次向后遍历。
同时我们也要注意cur和next不能为nullptr,若为nullptr就不需要交换。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution
{
public:
ListNode* swapPairs(ListNode* head)
{
if(head==nullptr||head->next==nullptr) return head;
ListNode* phead=new ListNode(-1);
phead->next=head;
// head->1->2->3->4
//prev->cur->next->nnext
// head->2->1->4->3
//prev->next->cur->nnext
ListNode*prev=phead,*cur=phead->next,*next=cur->next,*nnext=next->next;
ListNode* ans=phead->next;
// 注意cur和next不能为nullptr
while(cur&&next)
{
// 交换结点
prev->next=next;
next->next=cur;
cur->next=nnext;
// 修改指针
// 一定注意顺序
prev=cur;
cur=nnext;
// 注意cur和next不能为nullptr
if(cur) next=cur->next;
if(next) nnext=next->next;
}
cur=phead->next;
delete phead;
return cur;
}
};