2-9 I. DS单链表--结点交换

题目描述

用C++实现含头结点的单链表,然后实现单链表的两个结点交换位置。

注意不能简单交换两个结点包含数据,必须通过修改指针来实现两个结点的位置交换

交换函数定义可以参考:

swapNode(int  pa, int pb)  //pa和pb表示两个结点在单链表的位置序号

swapNode (ListNode * p, ListNode * q)  //p和q表示指向两个结点的指针

输入 

第1行先输入n表示有n个数据,接着输入n个数据

第2行输入要交换的两个结点位置

第3行输入要交换的两个结点位置

输入样例:

5 11 22 33 44 55
1 4
2 6 

输出 

第一行输出单链表创建后的所有数据,数据之间用空格隔开

第二行输出执行第1次交换操作后的单链表数据,数据之间用空格隔开

第三行输出执行第2次交换操作后的单链表数据,数据之间用空格隔开

如果发现输入位置不合法,输出字符串error,不必输出单链表

输出样例:

11 22 33 44 55 
44 22 33 11 55 
error

代码 

#include <iostream>
using namespace std;

struct Node{
    int data;
    Node *next;
};

class List{
public:
    Node *head;
    int n;
    List(){
        head = new Node;
        head->next = NULL;
    }

    void create(){
        Node *tail = head;
        cin >> n;
        for(int i = 0; i < n; i++){
            Node *s = new Node;
            cin >> s->data;
            s->next = NULL;
            tail->next = s;
            tail = s;
        }
        display();
    }

    void swapNode(int  pa, int pb){
        int i=0;
        Node *t = head;
        if(pa <= 0 || pb > n){
            cout << "error" << endl;
            return;
        }else{
            Node *p,*q,*temp1,*temp2;
            while(t){
                i++;
                if(i == pa){
                    p = t;
                }
                if(i == pb){
                    q = t;
                    break;
                }
                t = t->next;
            }
            temp1 = p->next;
            p->next = q->next;
            q->next = temp1;
            temp2 = p->next->next;
            p->next->next = temp1->next;
            q->next->next = temp2;
            display();
        }
    }
    
    void display(){
        Node *p = head->next;
        while(p){
            cout << p->data << " ";
            p = p->next;
        }
        cout << endl;
    }
};

int main()
{
    List list;
    int a,b;
    list.create();
    cin >> a >> b;
    list.swapNode(a,b);
    cin >> a >> b;
    list.swapNode(a,b);
    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值