给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100
解法:
通过设置奇偶标志对链表进行交换操作
根据题意,我们发现当链表走到奇数点时,节点与后面的节点进行交换,然后去往下一位;当走到偶数点时,不进行交换,直接走到下一位。通过设置一个标志,标记当前的节点的奇偶性,我们就可以对链表进行交换操作了。
注意一点,我们一开始设置p为头节点,只有当p和p->next != null时才可以进入while循环,二者缺一不可。且我们的循环条件为p->next != null,是为了应对链表整体为奇数的情况,链表走到最后,使得p->next不等于null,避免p和下一位不存在的节点进行交换,出现bug。
时时间复杂度o(n)
空间复杂度为o(1)
代码:
1. 2. class Solution { 3. public: 4. int cnt = 1,temp; 5. ListNode* swapPairs(ListNode* head) { 6. ListNode* p = new ListNode; 7. p = head; 8. if(p == nullptr) return head; 9. if(!p->next) return head; 10. while(p->next) 11. { 12. if(cnt % 2 == 1){ 13. temp = p->val; 14. p->val = p->next->val; 15. p->next->val = temp; 16. p = p->next; 17. cnt++; 18. } 19. else{ 20. p = p->next; 21. cnt++; 22. } 23. } 24. 25. return head; 26. } 27. };