两两交换链表中的节点

问题描述

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

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

可使用以下代码,完成其中的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;

}

输入说明

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

输出说明

输出格式见范例

输入范例

4
1 2 3 4

输出范例

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

实现思路

本题可以理解为奇数和偶数的交换(此处的奇偶是结点所处位置,不是数值的奇偶),那么就可以将原链表拆成两个链表,即一个存处于奇数位置上的结点,一个存处于偶数位置的结点。然后依次遍历两链表,先插入偶数链表上的结点,再插奇数链表上的结点,然后让奇偶链表都向后移一个结点,直至两链表为空。

实现代码
#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 || !head->next){//若链表为空或只有一个结点直接返回
                return head;
             }

             ListNode *odd = new ListNode;//偶
             ListNode *even = new ListNode;//奇
             ListNode *p,*q;//分别指向偶链表和奇链表的尾部
             p = odd;
             q = even;
             int i = 1;
             while(head){//拆分链表
                if(i%2!=0){
                    q->next = head;
                    q = head;
                }else{
                    p->next = head;
                    p = head;
                }
                head = head->next;
                i++;
             }

             p->next = NULL;//使偶链表的尾结点指向空
             q->next = NULL;//使奇链表的尾结点指向空

             //因为奇偶链表是有头结点的链表,以下两步操作使得两链表的头指针指向链表的第一个结点
             odd = odd->next;
             even = even->next;

             ListNode *newhead = new ListNode;
             ListNode *tail = newhead;
             while(odd&&even){//先插入偶链表的结点再插奇链表的结点
                tail->next = odd;
                tail = odd;
                odd = odd->next;

                tail->next = even;
                tail = even;
                even = even->next;
             }

             if(odd){
                tail->next = odd;
                tail = odd;
             }

             if(even){
                tail->next = even;
                tail = even;
             }

             tail->next = NULL;

             return newhead->next;





    }

};

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;

}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值