力扣(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;
- }
- };