力扣练习——7 两两交换链表中的节点

1.问题描述

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

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

 

可使用以下代码,完成其中的swapPairs函数,其中形参head指向无头结点单链表,返回结果链表的头指针。

#include<iostream>

#include<vector>

using namespace std;

 

struct ListNode

{

    int val;

    ListNode *next;

    ListNode() : val(0), next(NULL) {}

    ListNode(int x) : val(x), next(NULL) {}

    ListNode(int x, ListNode *next) : val(x), next(next) {}

};

class Solution {

public:

    ListNode* swapPairs(ListNode* head) {

             //填充本函数完成功能  

    }

};

ListNode *createByTail()

{

    ListNode *head;

    ListNode *p1,*p2;

    int n=0,num;

    int len;

    cin>>len;

    head=NULL;

    while(n<len && cin>>num)

    {

        p1=new ListNode(num);

        n=n+1;

        if(n==1)

            head=p1;

        else

            p2->next=p1;

        p2=p1;

    }

    return head;

}

void  displayLink(ListNode *head)

{

    ListNode *p;

    p=head;

    cout<<"head-->";

    while(p!= NULL)

    {

        cout<<p->val<<"-->";

        p=p->next;

    }

    cout<<"tail\n";

}

int main()

{

    ListNode* head = createByTail();

    head=Solution().swapPairs(head);

    displayLink(head);

    return 0;

}

2.输入说明

首先输入链表长度len,然后输入len个整数,以空格分隔。

3.输出说明

输出格式见范例

4.范例

输入

4
1 2 3 4

输出

head-->2-->1-->4-->3-->tail

5.代码

#include<iostream>
#include<vector>

using namespace std;

struct ListNode

{

    int val;

    ListNode *next;

    ListNode() : val(0), next(NULL) {}

    ListNode(int x) : val(x), next(NULL) {}

    ListNode(int x, ListNode *next) : val(x), next(next) {}

};

class Solution {

public:

    ListNode* swapPairs(ListNode* head) {

        
        //两两交换链表结点
        
        if (head == NULL||head->next==NULL)
            return head;

        ListNode *p, *q ,*pre ;
       
        p = head; pre = NULL; q = NULL;
        
        bool flag = true;
        while (p->next != NULL)
        {
            
            if (flag==true)//此处用来标记第一次交换的情况
            {
                flag = false;
                q = p->next;//q指向第二个结点,p指向第一个结点
                p->next = q->next;
                pre = p;//注意交换后,第二个结点变成了p
                head = q;//注意这里head直接指向第一个结点,即q
                q->next = p;
            }
            else
            {
                q = p->next;
                p->next = q->next;
                pre->next = q;
                q->next = p;
                pre = p;
            }
            //注意,这里必须这么写,若只写p=p->next ,会导致错误!
            //只有存在两个及以上结点时才能进行交换操作
            if (p->next != NULL)
                p = p->next;
            else
                break;
        }


        return head;

    }

};

ListNode *createByTail()

{

    ListNode *head;

    ListNode *p1, *p2=NULL;

    int n = 0, num;

    int len;

    cin >> len;

    head = NULL;

    while (n<len && cin >> num)

    {

        p1 = new ListNode(num);

        n = n + 1;

        if (n == 1)

            head = p1;

        else

            p2->next = p1;

        p2 = p1;

    }

    return head;

}

void  displayLink(ListNode *head)

{

    ListNode *p;

    p = head;

    cout << "head-->";

    while (p != NULL)

    {

        cout << p->val << "-->";

        p = p->next;

    }

    cout << "tail\n";

}

int main()

{

    ListNode* head = createByTail();

    head = Solution().swapPairs(head);

    displayLink(head);

    return 0;

}

 

posted @ 2022-07-03 23:03  努力奋斗的小企鹅  阅读(40)  评论(0)    收藏  举报