• DS单链表--结点交换 C++


    温馨提示:本题为深大OJ原题,深大的同学请勿直接抄袭,以免出现多个代码相同以致评0分的情况,代码和思路仅供参考,希望大家能逐步成长。

    目录

    题目描述

    思路分析

    AC代码 


    题目描述

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

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

    交换函数定义可以参考:

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

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

    输入

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

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

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

    输出

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

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

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

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

    输入样例1 

    5 11 22 33 44 55
    1 4
    2 6

    输出样例1

    11 22 33 44 55 
    44 22 33 11 55 
    error

    提示

    注意要用链表实现哦

    思路分析

    我们在以及实现了插入和删除的操作的基础上来解决这道题,我使用的是用位置作为参数的方式,首先继续是先判断位置是否非法,非法我直接送走,不过一般不会非法……然后记录下这两个位置的元素,然后删掉这两个位置的元素,然后再在对方的位置上插入自己的元素。

    这里需要注意删除的顺序,因为一旦进行删除的操作之后,原有链表的元素逻辑位置会发生一定的变化,所以需要删一个,然后在删除的位置上插一个,然后再删一个,再在删除的位置上插一个。

    AC代码 

    1. #include <iostream>
    2. using namespace std;
    3. #define OK 0
    4. #define ERROR -1
    5. //结点类定义
    6. class ListNode {
    7. public:
    8. int data;
    9. ListNode * next;
    10. ListNode() {
    11. data = -9999, next = NULL;
    12. }
    13. };
    14. class LinkList {
    15. //带头结点的单链表,位置从0到n,0是头结点,1是首结点,n是尾结点
    16. private:
    17. ListNode * head; //头结点
    18. int size; //表长
    19. public:
    20. LinkList(); //构造函数,创建头结点
    21. ~LinkList(); //析构函数,逐个结点回收
    22. int LL_insert(int item, int i); //第i位置插入元素,操作成功或失败返回OK或ERROR
    23. int LL_del(int i); //删除第i位置的元素,操作成功或失败返回OK或ERROR
    24. int LL_get(int i); //获取位置i的元素的数值,查找成功返回数值,查找失败返回ERROR
    25. void LL_print();
    26. void swap(int pa,int pb){
    27. if(pa<1||pb<1||pa>size||pb>size){
    28. cout<<"error"<<endl;
    29. return;
    30. }
    31. int item_a=LL_get(pa),item_b=LL_get(pb);
    32. LL_del(pa);
    33. LL_insert(item_b,pa);
    34. LL_del(pb);
    35. LL_insert(item_a,pb);
    36. LL_print();
    37. } //打印单链表所有数据
    38. };
    39. LinkList::LinkList(): size(0) {
    40. head = new ListNode();
    41. }
    42. LinkList::~LinkList() {
    43. ListNode *p, *q;
    44. p = head->next;
    45. while (p != NULL) {
    46. q = p;
    47. p = p->next;
    48. delete q;
    49. }
    50. size = 0;
    51. head->next = NULL;
    52. }
    53. int LinkList::LL_insert(int item, int i) {
    54. if (i < 1 || i > size + 1)
    55. return ERROR;
    56. ListNode*p = head;
    57. int j = 1;
    58. while (j++ < i) {
    59. p = p->next;
    60. }
    61. ListNode*q = new ListNode();
    62. q->data = item;
    63. q->next = p->next;
    64. p->next = q;
    65. size++;
    66. return OK;
    67. }
    68. int LinkList::LL_del(int i) {
    69. if (i < 1 || i > size)
    70. return ERROR;
    71. ListNode*p = head, *q = head->next;
    72. int j = 1;
    73. while (j++ < i) {
    74. p = p->next;
    75. q = q->next;
    76. }
    77. p->next = q->next;
    78. delete q;
    79. size--;
    80. return OK;
    81. }
    82. int LinkList::LL_get(int i) {
    83. if (i < 1 || i > size)
    84. return ERROR;
    85. ListNode*p = head->next;
    86. int j = 1;
    87. while (j++ < i) {
    88. p = p->next;
    89. }
    90. return p->data;
    91. }
    92. void LinkList::LL_print() {
    93. ListNode*p = head->next;
    94. for (int i = 1; i <=size; i++) {
    95. cout << p->data << ' ';
    96. p = p->next;
    97. }
    98. cout << endl;
    99. }
    100. int main() {
    101. int n,item,pa,pb;
    102. LinkList test;
    103. cin>>n;
    104. for(int i=1;i<=n;i++){
    105. cin>>item;
    106. test.LL_insert(item,i);
    107. }
    108. test.LL_print();
    109. for(int i=0;i<2;i++){
    110. cin>>pa>>pb;
    111. test.swap(pa,pb);
    112. }
    113. return 0;
    114. }
  • 相关阅读:
    vue中 ”...“ 的作用
    中国各地级市的银行金融机构网点数据(2007-2022年)
    centos 8.2 指南
    第二章计算机网络参考模型
    JavaScript基础知识12——运算符:算数运算符,比较运算符
    Java并发编程: Thread常见方法
    MySQL关联数据表操作方式
    Json数据格式
    ModelBox开发体验:使用YOLOv3做口罩检测
    【深度学习】Fooocus-MRE docker镜像 CUDA11.8
  • 原文地址:https://blog.csdn.net/weixin_62264287/article/details/127091706