Leetcode24-两两交换链表中的节点

题目:两两交换链表中的节点

解答:

方法一:头结点+直接两两交换每一对相邻结点

关键点:处理好相邻结点交换过程中的”指针变换次序“

ListNode* swapPairs(ListNode* head) {
        if(!head) return nullptr;
        ListNode dummy(0);
        dummy.next = head;
        ListNode* pre = &dummy;
        ListNode* cur = head;
        while(cur && cur->next)//待交换的一对元素
        {
            pre->next = cur->next;
            pre = pre->next;
            cur->next = pre->next;
            pre->next = cur;
            pre = cur;
            cur = cur->next;
        }
        return dummy.next;
    }

4ms;-2%


方法二:递归—交换head与last即为一对

ListNode* swapPairs(ListNode* head) {
        if(head == nullptr) return nullptr;
        if(head->next == nullptr) return head;
        ListNode* last = head->next;
        head->next = swapPairs(last->next);
        last->next = head;
        return last;
    }

4ms;-2%


方法三:指针的指针

ListNode* swapPairs(ListNode* head) {
        ListNode **pp = &head,*a,*b;
        while((a = *pp) && (b = a->next))//这里的循环判断设置得非常巧妙
        {
            a->next = b->next;
            b->next = a;
            *pp = b;
            pp = &(a->next);
        }
        return head;
    }

方法四:第一次自己的思路-分别保存奇数序号和偶数序号的链表,然后将奇数序号链表中的元素插入到偶数序号链表的元素中——超时

    ListNode* swapPairs(ListNode* head) {
        if(head == nullptr) return nullptr;
        if(head->next == nullptr) return head;
        ListNode dummy(0);
        dummy.next = head;
        ListNode* odd = head;
        ListNode* oddLast = head;
        ListNode* even = &dummy;
        ListNode* evenLast = &dummy;
//拆分成两个链表
        while(odd && odd->next)
        {
            //偶数序号
            evenLast = even;
            even = even->next->next;
            evenLast->next = even;
            //奇数序号
            oddLast = odd;
            odd = odd->next->next;
            oddLast->next = odd;
        }
        cout<< dummy.next->val <next;
        even = &dummy;
        evenLast = dummy.next;
//插入
        while(oddLast && evenLast)
        {
            even = evenLast;
            evenLast = evenLast->next;
            //
            even->next = odd;
            odd->next = evenLast;
            //
            odd = oddLast;
            oddLast = oddLast->next;
        }
        if(oddLast==nullptr && evenLast==nullptr) {even->next->next = odd;}
        if (oddLast==nullptr && evenLast!=nullptr) {evenLast->next = odd;}
        return dummy.next;
    }

总结:

1.本题主要考察的是结点交换过程中指针的操作问题

你可能感兴趣的:(Leetcode24-两两交换链表中的节点)