数据结构 链表(上)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 数据结构 链表

1. DS单链表–类实现


题目描述


用C++语言和类实现单链表,含头结点


属性包括:data数据域、next指针域


操作包括:插入、删除、查找


注意:单链表不是数组,所以位置从1开始对应首结点,头结点不放数据


1f3cb51fac164c39a79ba78b16115c12.png


输入


n


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


第2行输入要插入的位置和新数据


第3行输入要插入的位置和新数据


第4行输入要删除的位置


第5行输入要删除的位置


第6行输入要查找的位置


第7行输入要查找的位置


输出


n


数据之间用空格隔开,


第1行输出创建后的单链表的数据


每成功执行一次操作(插入或删除),输出执行后的单链表数据


每成功执行一次查找,输出查找到的数据


如果执行操作失败(包括插入、删除、查找等失败),输出字符串error,不必输出单链表


输入样例


6 11 22 33 44 55 66

3 777

1 888

1

11

0

5


输出样例


11 22 33 44 55 66

11 22 777 33 44 55 66

888 11 22 777 33 44 55 66

11 22 777 33 44 55 66

error

error

44


参考代码

#include <bits/stdc++.h>
using namespace std;
#define ok 0
#define error -1
//链表结点类定义
class ListNode {
public:
    int data;
    ListNode *next;
    ListNode() {
        next = NULL;
    }
};
//带头结点的单链表类定义
class LinkList {
public:
    ListNode *head;
    int len;
    //操作定义
    LinkList() {
        head = new ListNode();
        len = 0;
    }
    //链表回收,要逐个结点回收
    ~LinkList() {
        ListNode *p, *q;
        p = head;
        while (p != NULL) {
            q = p;
            p = p->next;
            delete q;
        }
        len = 0;
        head = NULL;
    }
    //返回第i个结点的指针,如果不存在返回NULL
    ListNode *LL_index(int i) {
        if (i < 0 || i > len)
            return NULL;
        int k = 0;
        ListNode *p = head;
        while (p && k < i) {
            p = p->next;
            k++;
        }
        return p;
    }
    //获取第i个元素的数据
    int LL_get(int i) {
        ListNode *p = LL_index(i);
        return p->data;
    }
    //把数值item插入第i个位置
    int LL_insert(int i, int item) {
        if (i <= 0 || i > len + 1)
            return error;
        ListNode *p = LL_index(i - 1);
        ListNode *newNode = new ListNode();
        newNode->data = item;
        newNode->next = p->next;
        p->next = newNode;
        len++;
        return ok;
    }
    //删除第i个结点
    int LL_del(int i) {
        if (i <= 0 || i > len)
            return error;
        ListNode *p = LL_index(i - 1);
        ListNode *q = p->next;
        p->next = q->next;
        delete q;
        return ok;
    }
    //输出单链表的内容
    void LL_display() {
        ListNode *p;
        p = head->next;
        while (p) {
            cout << p->data << " ";
            p = p->next;
        }
        cout << endl;
    }
    //结点交换
    int swap(int pa, int pb) {
        ListNode *pa_point = LL_index(pa);
        ListNode *pb_point = LL_index(pb);
        if (!pa_point || !pb_point)
            return error;
        ListNode *front_pa = LL_index(pa - 1);
        ListNode *front_pb = LL_index(pb - 1);
        ListNode *temp = pa_point->next;
        pa_point->next = pb_point->next;
        pb_point->next = temp;
        front_pa->next = pb_point;
        front_pb->next = pa_point;
        return ok;
    }
    //两个单链表的合并
    int LL_merge(ListNode *La, ListNode *Lb) {
        ListNode *p = head;
        while (La && Lb) {
            if (La->data < Lb->data) {
                ListNode *temp = new ListNode();
                temp->data = La->data;
                temp->next = La->next;
                p->next = temp;
                p = p->next;
                La = La->next;
                len++;
            } else {
                ListNode *temp = new ListNode();
                temp->data = Lb->data;
                temp->next = Lb->next;
                p->next = temp;
                p = p->next;
                Lb = Lb->next;
                len++;
            }
        }
        while (La) {
            ListNode *temp = new ListNode();
            temp->data = La->data;
            temp->next = La->next;
            p->next = temp;
            p = p->next;
            La = La->next;
            len++;
        }
        while (Lb) {
            ListNode *temp = new ListNode();
            temp->data = Lb->data;
            temp->next = Lb->next;
            p->next = temp;
            p = p->next;
            Lb = Lb->next;
            len++;
        }
        return 1;
    }
};
int main() {
    int n;
    cin >> n;
    LinkList ex;
    //输入数据
    for (int i = 0; i < n; i++) {
        int data;
        cin >> data;
        ex.LL_insert(i + 1, data);
    }
    ex.LL_display();
    int index, data;
    //插入
    cin >> index >> data;
    if (ex.LL_insert(index, data) == 0)
        ex.LL_display();
    else
        cout << "error" << endl;
    cin >> index >> data;
    if (ex.LL_insert(index, data) == 0)
        ex.LL_display();
    else
        cout << "error" << endl;
    //删除
    cin >> index;
    if (ex.LL_del(index) == 0)
        ex.LL_display();
    else
        cout << "error" << endl;
    cin >> index;
    if (ex.LL_del(index) == 0)
        ex.LL_display();
    else
        cout << "error" << endl;
    //查找
    cin >> index;
    if (ex.LL_index(index) && ex.LL_index(index) != ex.head)
        cout << ex.LL_get(index) << endl;
    else
        cout << "error" << endl;
    cin >> index;
    if (ex.LL_index(index) && ex.LL_index(index) != ex.head)
        cout << ex.LL_get(index) << endl;
    else
        cout << "error" << endl;
}

2. 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 <bits/stdc++.h>
using namespace std;
#define ok 0
#define error -1
//链表结点类定义
class ListNode {
public:
    int data;
    ListNode *next;
    ListNode() {
        next = NULL;
    }
};
//带头结点的单链表类定义
class LinkList {
public:
    ListNode *head;
    int len;
    //操作定义
    LinkList() {
        head = new ListNode();
        len = 0;
    }
    //链表回收,要逐个结点回收
    ~LinkList() {
        ListNode *p, *q;
        p = head;
        while (p != NULL) {
            q = p;
            p = p->next;
            delete q;
        }
        len = 0;
        head = NULL;
    }
    //返回第i个结点的指针,如果不存在返回NULL
    ListNode *LL_index(int i) {
        if (i < 0 || i > len)
            return NULL;
        int k = 0;
        ListNode *p = head;
        while (p && k < i) {
            p = p->next;
            k++;
        }
        return p;
    }
    //获取第i个元素的数据
    int LL_get(int i) {
        ListNode *p = LL_index(i);
        return p->data;
    }
    //把数值item插入第i个位置
    int LL_insert(int i, int item) {
        if (i <= 0 || i > len + 1)
            return error;
        ListNode *p = LL_index(i - 1);
        ListNode *newNode = new ListNode();
        newNode->data = item;
        newNode->next = p->next;
        p->next = newNode;
        len++;
        return ok;
    }
    //删除第i个结点
    int LL_del(int i) {
        if (i <= 0 || i > len)
            return error;
        ListNode *p = LL_index(i - 1);
        ListNode *q = p->next;
        p->next = q->next;
        delete q;
        return ok;
    }
    //输出单链表的内容
    void LL_display() {
        ListNode *p;
        p = head->next;
        while (p) {
            cout << p->data << " ";
            p = p->next;
        }
        cout << endl;
    }
    //结点交换
    int swap(int pa, int pb) {
        ListNode *pa_point = LL_index(pa);
        ListNode *pb_point = LL_index(pb);
        if (!pa_point || !pb_point)
            return error;
        ListNode *front_pa = LL_index(pa - 1);
        ListNode *front_pb = LL_index(pb - 1);
        ListNode *temp = pa_point->next;
        pa_point->next = pb_point->next;
        pb_point->next = temp;
        front_pa->next = pb_point;
        front_pb->next = pa_point;
        return ok;
    }
    //两个单链表的合并
    int LL_merge(ListNode *La, ListNode *Lb) {
        ListNode *p = head;
        while (La && Lb) {
            if (La->data < Lb->data) {
                ListNode *temp = new ListNode();
                temp->data = La->data;
                temp->next = La->next;
                p->next = temp;
                p = p->next;
                La = La->next;
                len++;
            } else {
                ListNode *temp = new ListNode();
                temp->data = Lb->data;
                temp->next = Lb->next;
                p->next = temp;
                p = p->next;
                Lb = Lb->next;
                len++;
            }
        }
        while (La) {
            ListNode *temp = new ListNode();
            temp->data = La->data;
            temp->next = La->next;
            p->next = temp;
            p = p->next;
            La = La->next;
            len++;
        }
        while (Lb) {
            ListNode *temp = new ListNode();
            temp->data = Lb->data;
            temp->next = Lb->next;
            p->next = temp;
            p = p->next;
            Lb = Lb->next;
            len++;
        }
        return 1;
    }
};
int main() {
    int n;
    cin >> n;
    LinkList ex;
    //输入数据
    for (int i = 0; i < n; i++) {
        int data;
        cin >> data;
        ex.LL_insert(i + 1, data);
    }
    ex.LL_display();
    int index1, index2;
    cin >> index1 >> index2;
    if (ex.swap(index1, index2) == 0)
        ex.LL_display();
    else
        cout << "error" << endl;
    cin >> index1 >> index2;
    if (ex.swap(index1, index2) == 0)
        ex.LL_display();
    else
        cout << "error" << endl;
}


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
27天前
|
缓存
数据结构之 - 链表数据结构详解: 从基础到实现
数据结构之 - 链表数据结构详解: 从基础到实现
61 6
|
27天前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
84 64
|
23小时前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
21天前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
23 7
|
21天前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
20 3
|
20天前
|
算法 Java
数据结构与算法学习五:双链表的增、删、改、查
双链表的增、删、改、查操作及其Java实现,并通过实例演示了双向链表的优势和应用。
14 0
数据结构与算法学习五:双链表的增、删、改、查
【数据结构】——双向链表详细理解和实现
【数据结构】——双向链表详细理解和实现
|
24天前
|
存储 Java
【数据结构】链表
【数据结构】链表
15 1
|
25天前
|
存储 缓存
数据结构3——双向链表
数据结构3——双向链表
90 1