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

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

LeetCode 24.两两交换链表中的结点_第1张图片

题目解析

        首先可以特判一下,如果结点数目小于等于1,则直接返回即可,因为数目小于等于1就不需要交换了。

        然后我们可以创建一个虚拟的头结点,然后如图所示定义几个结点指针,经过图中的顺序进行交换结点,然后将结点依次向后遍历。

        同时我们也要注意cur和next不能为nullptr,若为nullptr就不需要交换。 

LeetCode 24.两两交换链表中的结点_第2张图片

 

代码

/**
 * 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) 
    {
        if(head==nullptr||head->next==nullptr) return head;
        ListNode* phead=new ListNode(-1);
        phead->next=head;
        // head->1->2->3->4
        //prev->cur->next->nnext

        // head->2->1->4->3
        //prev->next->cur->nnext

        ListNode*prev=phead,*cur=phead->next,*next=cur->next,*nnext=next->next;
        ListNode* ans=phead->next;
        
        // 注意cur和next不能为nullptr
        while(cur&&next)
        {
            // 交换结点
            prev->next=next;
            next->next=cur;
            cur->next=nnext;
            // 修改指针
            // 一定注意顺序
            prev=cur;
            cur=nnext;
            // 注意cur和next不能为nullptr
            if(cur) next=cur->next;
            if(next) nnext=next->next;
        }
        cur=phead->next;
        delete phead;
        return cur;
    }
};

你可能感兴趣的:(算法练习,leetcode,链表,算法)