LeetCode—— 两两交换链表中的节点

部分来源于https://www.cnblogs.com/healthylife/p/5866391.html

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

示例:

说明:

  • 你的算法只能使用常数的额外空间。
  • 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

#include<cstdlib>
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head == NULL || head->next == NULL)
            return head;
        ListNode *temp = head, *pre = NULL, *next = NULL, *nextGroup = NULL, *newHead;
        if(head->next->next == NULL)
        {
            next = head->next;
            next->next = head;
            return next;
        }
        bool flag = true;
        newHead = head->next;
        while(temp != NULL)
        {
            next = temp->next;
            if(next == NULL)
            {
                pre->next = temp;
                flag = false;
                break;
            }
            if(pre != NULL)
            {
                pre->next = next;
            }          
            nextGroup = next->next;
            next->next = temp;
            pre = temp;
            temp = nextGroup;
        }
        if(flag == true)
        {
            pre->next = NULL;
        }      
        return newHead;
    }
};

显示超时,最后执行的输入,[1,2]     以后检查修正

别人用迭代写的代码

#include<cstdlib>
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(!head || !head->next) return head;
        ListNode *p = head, *q = head->next, *k = head;
        while(q) {
            p->next = q->next;
            if(p != head)  k->next = q;
            if(p == head)  head = q;
            k = p;
            p = p->next;
            if(p) q = p->next;
            else  q = NULL;
        }
        return head;
    }
};

考虑组与组之间的联系时,是先把这组与下一组相连(不妄图一步连正确,走到下一组时再修正),而不是走到下一组时再考虑上一组与该组的连接问题。同样,也考虑了奇数个节点的问题。

也有人用递归的方法而不是迭代,几步就写出来了

#include<cstdlib>
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(!head) return NULL;
        if(!head->next) return head;
        ListNode* temp=head->next;
        head->next=swapPairs(temp->next);
        temp->next=head;
        return temp;
    }
};


有人直接修改节点val的值,也通过了测试,但其实是不满足要求的。

#include<cstdlib>
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head==NULL) return head;
        ListNode* p = head;
        while(p != NULL && p->next != NULL){
            int tmp = p->val;
            p->val = p->next->val;
            p->next->val = tmp;
            p = p->next->next;
        }
        return head;
    }
};


猜你喜欢

转载自blog.csdn.net/eartha1995/article/details/81006202