题目
分析
就是每两交换值,或者交换结点,奇数的话最后一个就不换了。
代码
/**
* 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)
{
ListNode* dummyHead = new ListNode(0); //创建一个哑结点
dummyHead->next = head; //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;
}
};
测评结果
总结
还可以使用递归方法,不过这样的话空间复杂度是O(n),这种直接在链表上改变,空间复杂度是O(1)。当然是选择合适且更好的。