24 两两交换链表中的节点

思路简单,但是操作的时候还是要注意细节,特别是某些结点的next指针变化需要格外关注,报了很多次错。因为没注意到:每次替换两个结点后,应该让当前的后面的结点指向下两个结点的靠后一点的结点。主要还是画完图后没有走一遍链表

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* left = head; 
        if (left== NULL) return head;
        ListNode* right = left->next;  
        if (right == NULL) return head;

        ListNode* newhead = right;

        while(left != nullptr && left->next != nullptr)
        {   
            left->next = right->next;
            right->next = left;
            ListNode* temp1 = left->next;
            if(temp1 == NULL) break;
            else
            {
                ListNode* temp2 = temp1->next;
                if(temp2 == NULL) break;
                else
                {
                    left->next = temp2;//如果没有这一步就会导致链表断开
                    left = temp1;
                    right = temp2; 
                }
                
            }             
        }
        return newhead;
    }
};

后面去看了别人使用虚拟头结点代码,思路也是差不多。不过确实要简洁不少。使用虚拟头结点时还有考虑虚拟结点的移动,自己写的时候感觉是按照next的顺序来改变next不容易混乱

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
         ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;      

        ListNode* cur =dummyHead;
        while(cur->next != nullptr && cur->next->next != nullptr)
        {
           ListNode* temp1 = cur->next;
           ListNode* temp2 = cur->next->next;
           cur->next = temp2;
           temp1->next = temp2->next;//保证链表不断开
           temp2->next = temp1;
           
           cur = temp1;
        }
        ListNode* res = dummyHead->next;
        return res;
    }
};
posted @ 2025-01-03 22:54  名字好难想zzz  阅读(14)  评论(0)    收藏  举报