DS单链表--结点交换

题目描述

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

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

交换函数定义可以参考:

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

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

输入

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

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

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

输出

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

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

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

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

样例输入

5 11 22 33 44 55 1 4 2 6

样例输出

11 22 33 44 55 44 22 33 11 55 error

提示

注意要用链表实现哦!

#include<iostream>
using namespace std;
#define ok 0
#define error -1
class CNode
{
    int data;
    CNode *next;
public:
    CNode()
    {
        next=NULL;
    }
    CNode(int n,CNode *p)
    {
        data=n;
        next=p;
    }
    int getdata()
    {
        return data;
    }
    CNode *getnext()
    {
        return next;
    }
    void setnext(CNode *p)
    {
        next=p;
    }
};

class CList
{
    friend class CNode;
    CNode *head;
    int nodenumber;
public:
    CList()
    {
        head=NULL;
        nodenumber=0;
    }
    ~CList()
    {
        for(int i=0;i<nodenumber;i++)
        {
            CNode *p=head;
            head=head->getnext();
            delete p;
        }
    }
    void nodeplus()
    {
        nodenumber++;
    }
    void nodeminus()
    {
        nodenumber--;
    }
    void createTailList(int *num,int n)
    {
        CNode *tail;
        CNode *s;
        head=new CNode();
        tail=head;
        for(int i=0;i<n;i++)
        {
            s=new CNode(num[i],NULL);
            tail->setnext(s);
            tail=s;
            nodeplus();
        }
    }
    CNode *findreal(int i)
    {
        if(i<=0||i>nodenumber)
        {
            cout<<"error"<<endl;
            return NULL;
        }
        else
            return indexfind(i);
    }
    CNode *indexfind(int i)
    {
        if(i<0)
        {
            return NULL;
        }
        CNode *p=head;
        int k=1;
        while(k<=i&&p!=NULL)
        {
            p=p->getnext();
            k++;
        }
        return p;
    }
    int Insert(int i,int num)
    {
        if(i<=0||i>nodenumber+1)
        {
            cout<<"error"<<endl;
            return error;
        }
        nodeplus();
        CNode *p=indexfind(i-1);
        CNode *temp=new CNode(num,p->getnext());
        p->setnext(temp);
        return ok;
    }
    int Delete(int i)
    {
        if(i<1||i>nodenumber)
        {
            cout<<"error"<<endl;
            return error;
        }
        nodeminus();
        CNode *p=indexfind(i-1);
        CNode *temp=p->getnext();
        p->setnext(temp->getnext());
        delete temp;
        return ok;
    }
    void display()
    {
        CNode *p=head->getnext();
        while(p!=NULL)
        {
            cout<<p->getdata()<<" ";
            p=p->getnext();
        }
        cout<<endl;
    }
    int nodeswap(int a1,int b1)
    {
        if(a1<=0||a1>nodenumber||b1<=0||b1>nodenumber)
        {
            cout<<"error"<<endl;
            return error;
        }
        CNode *t1=indexfind(a1-1);
        CNode *t2=indexfind(b1-1);
        CNode *a=indexfind(a1);
        CNode *b=indexfind(b1);
        CNode *temp=b->getnext();
        t1->setnext(b);
        b->setnext(a->getnext());
        t2->setnext(a);
        a->setnext(temp);
        return ok;
    }
};

int main()
{
    int n;
    cin>>n;
    int *num=new int[n];
    for(int i=0;i<n;i++)
    {
        cin>>num[i];
    }
    CList L;
    L.createTailList(num,n);
    L.display();
    int a,b;
    cin>>a>>b;
    if(L.nodeswap(a,b)!=error)
        L.display();
    cin>>a>>b;
    if(L.nodeswap(a,b)!=error)
        L.display();
    delete []num;
    return 0;
}

原文地址:https://www.cnblogs.com/SZU-DS-wys/p/12177890.html

时间: 2024-08-30 13:15:45

DS单链表--结点交换的相关文章

两种删除单链表结点的实现,一种O(n),一种O(1)

常规的删除单链表结点的做法是挨个查找到该结点的前一个结点,然后去掉要删除的这个结点,回收内存.这个需要O(n)的时间. 有一种比较快速的删除掉链表指定一个节点的方法,就是把下一个结点的内容复制到当前这个结点,然后把下一次结点删除掉,这个需要考虑当要删除的结点是最后一个结点的情况. 如果刚好是最后一个结点,则需要O(n)的时间,如果不是最后一个结点,可以在O(1)时间内完成删除操作. 1 // 2 // main.c 3 // SingleListDeleteNode 4 // 5 // Crea

时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和做法. 如图所示,删除结点 i,那么只需找到 i 的前驱 h,然后连 h 到 j,再销毁i 即可.虽然可以安全的删除 i 结点,但是是顺序查找找到 i,之后删除,时间复杂度是 O(n)级别的.具体做法就是:顺序查找整个单链表,找到要删除结点 i 的直接前驱 h,把 h额 next 指向i 的 nex

在O(1)时间内删除单链表结点

// 在O(1)时间内删除单链表结点 /* 思考: 很显然链表是一个节点地址不连续的存储结构 删除节点一般很容易会想到是修改p节点的前一个节点的next为p->next 然而除非是双向链表,否则无法在常量级的时间里找到p的前节点 转变思路: 既然改变不了p前节点的next 只能在p 本身动手脚 那可以考虑修改p->data 使得p->data的值为p->next->data的值,同样可以达到效果 */ #include <iostream> #include &l

习题11-8 单链表结点删除 (20分)

习题11-8 单链表结点删除 (20分) 本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中所有存储了某给定值的结点删除.链表结点定义如下: struct ListNode { int data; ListNode *next; }; 函数接口定义: struct ListNode *readlist(); struct ListNode *deletem( struct ListNode *L, int m ); 函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表

剑指offer (13) O(1)时间删除单链表结点

单链表删除结点操作: 方法一.  从链表的第一个结点开始遍历,顺序遍历到需删除结点的前一个结点,然后调整指针指向  T(n) = O(n) 方法二.  将 需删除结点i的下一个结点j(如果存在) 的值赋值给 需删除结点i,然后 删除结点j,这就相当于删除了结点i  T(n) = O(1) 需要注意以下几点: 1. 如果待删除结点为单链表尾结点,此时 其后无后继结点,这时需要 从链表开头开始 顺序遍历查找 待删除结点的前驱结点 2. 如果单链表就只有一个结点,且需要删除头结点,此时 需要修改链表头

【Leetcode解题报告】单链表结点位置调整

Leetcode 206 Reverse Linked List 题目描述 Reverse a singly linked list. 分析与解法 (1) 递归解法 参考代码如下: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { pu

DS单链表--类实现

题目描述 用C++语言和类实现单链表,含头结点 属性包括:data数据域.next指针域 操作包括:插入.删除.查找 注意:单链表不是数组,所以位置从1开始对应首结点,头结点不放数据 类定义参考 输入 n第1行先输入n表示有n个数据,接着输入n个数据第2行输入要插入的位置和新数据第3行输入要插入的位置和新数据第4行输入要删除的位置第5行输入要删除的位置第6行输入要查找的位置第7行输入要查找的位置 输出 n 数据之间用空格隔开, 第1行输出创建后的单链表的数据 每成功执行一次操作(插入或删除),输

【Leetcode解题报告】单链表结点删除相关问题

Leetcode 203 Remove Linked List Elements 问题描述 Remove all elements from a linked list of integers that have value val. For example, given 1 -> 2 -> 6 -> 3 -> 4 -> 5 -> 6, val = 6. Return 1 -> 2 -> 3 -> 4 -> 5. 分析与解法 遍历链表,用一个指针

Leetcode24---&gt;Swap Nodes in Pairs(交换单链表中相邻的两个节点)

题目:给定一个单链表,交换两个相邻的节点,且返回交换之后的头节点 举例: Given 1->2->3->4, you should return the list as 2->1->4->3. 解题思路: 题目本身很简单,但是要注意一些细节: 1.  两对节点之间的连接 2.  如果只剩下一个节点,则不需要交换 代码如下: 1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4