题目

24 两两交换链表的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
image.png

思路

又是原地变换链表,优先考虑双指针法。当然也建议加上虚拟头节点,使代码更统一不用做区分了。
接下来就是交换相邻两个元素了,此时一定要画图,不画图,操作多个指针很容易乱,而且要记住操作的先后顺序。
image.png
image.png

  1. class Solution
  2. {
  3. public:
  4. ListNode *swapPairs(ListNode *head)
  5. {
  6. ListNode *newHead = new ListNode(0, head);
  7. ListNode *prev = newHead, *cur = head;
  8. while (cur != nullptr && cur->next != nullptr)
  9. {
  10. //变换位置的四个步骤
  11. cur = cur->next;
  12. prev->next->next = cur->next;
  13. cur->next = prev->next;
  14. prev->next = cur;
  15. // cur和prev移动两位,准备下一轮交换
  16. cur = cur->next->next;
  17. prev = prev->next->next;
  18. }
  19. ListNode *tmp = newHead->next;
  20. delete newHead;//删除临时内存
  21. return tmp;
  22. }
  23. };