24.两两交换链表中的结点

一、递归

image.png
将新头结点指向第二个结点,第二个结点指向第一个结点,第一个结点指向后面的结点,后面的结点进行递归。

  1. class Solution {
  2. public:
  3. ListNode* swapPairs(ListNode* head) {
  4. if (head == NULL || head->next == NULL) {
  5. return head;
  6. }
  7. ListNode* newHead = head->next;
  8. head->next = swapPairs(newHead->next);
  9. newHead->next = head;
  10. return newHead;
  11. }
  12. };

二、迭代

image.png
image.png

  1. class Solution {
  2. public:
  3. ListNode* swapPairs(ListNode* head) {
  4. ListNode* dummHead = new ListNode(0);
  5. dummHead->next = head;
  6. ListNode* cur = dummHead;
  7. while(cur->next && cur->next->next)
  8. {
  9. ListNode* node1 = cur->next;
  10. ListNode* node2 = cur->next->next;
  11. cur->next = node2;
  12. node1->next = node2->next;
  13. node2->next = node1;
  14. cur = node1;
  15. }
  16. return dummHead->next;
  17. }
  18. };