这个leetCode题目难度虽然是中等的,但实现起来还是挺简单的,我直接贴代码,里面都有注释,我解释的很清楚了。
/**
* 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;
}
//int i=1;
//int i=0;
//两个指针,一个指向前一个,一个指向后一个,用来做交换
ListNode* first=head;
ListNode* firstNext=head->next;
ListNode* saveFirstNext=nullptr; //这个指针用来保存交换完后第二个节点,第一次交换不用保存
//但在第二次交换的时候,如果不保存的话,链表会丢失一部分节点,因为前面也有节点
while(first!=nullptr&&firstNext!=nullptr)
{
if(saveFirstNext==nullptr) //如果是第一次交换的话
{
//交换两个节点
first->next=firstNext->next;
firstNext->next=first;
ListNode*temp=nullptr;
temp=firstNext;
firstNext=first;
first=temp;
head=first; //理由与下面一样,这次是节点交换后与头指针的联系没了
//所以要给头指针重新赋值
//这个操作只在第一次交换的时候用,第二次就不用了
}
else
{
first->next=firstNext->next;
firstNext->next=first;
ListNode*temp=nullptr;
temp=firstNext;
firstNext=first;
first=temp; //上面的操作是交换两个节点,交换后,first不在指向交换的第一个节点
//firstNext也不指向交换的第二个节点,双方的位置互换了,所以要把它们换过来
//换过来后会丢失与之前节点的联系,所以才有了saveFirstnext
saveFirstNext->next=first;
}
if(firstNext->next==nullptr)
{
break;
}
//从第二次开始,saveFirstNext就不是空的了
saveFirstNext=firstNext;
first=first->next->next;
firstNext=firstNext->next->next;
}
return head;
}
};