美文网首页
Leetcode24-两两交换链表中的节点

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

作者: 小豆oo | 来源:发表于2019-01-15 15:50 被阅读0次

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

解答:

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

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

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 <<endl;
        //拼接
        odd = head;
        oddLast = head->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.本题主要考察的是结点交换过程中指针的操作问题

相关文章

  • LeetCode-24 两两交换链表中的节点

    题目:24. 两两交换链表中的节点 难度:中等 分类:链表 解决方案:节点的交换 今天我们学习第24题两两交换链表...

  • LeetCode 24. 两两交换链表中的节点

    24. 两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点...

  • Leetcode 24 两两交换链表中的节点

    两两交换链表中的节点 题目 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内...

  • leetCode进阶算法题+解析(四)

    两两交换链表中的节点 题目:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部...

  • Swift - LeetCode - 两两交换链表中的节点

    题目 两两交换链表中的节点 问题: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 说明: 你的算法只...

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

    题目:两两交换链表中的节点 解答: 方法一:头结点+直接两两交换每一对相邻结点 关键点:处理好相邻结点交换过程中的...

  • 【LeetCode】24.两两交换链表中的节点

    题目描述 24.两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的...

  • 链表五:链表的反转

    题目地址: 两两交换链表中的节点题目描述: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只...

  • 24. 两两交换链表中的节点

    24.两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 示例: 给定1->2->3...

  • 每周 ARTS 第 21 期

    1. Algorithm 24. 两两交换链表中的节点(中等) 描述: 给定一个链表,两两交换其中相邻的节点,并返...

网友评论

      本文标题:Leetcode24-两两交换链表中的节点

      本文链接:https://www.haomeiwen.com/subject/hxjydqtx.html