ZBLOG

使用单链表的其他方法实现该代码:#ifndef NULL #define NULL 0 #endif #include using namespace std; //定义单链表结点结构 struct LNode { int data; LNode* next; LNode() {}; LNode(int e, LNode* n = NULL) :data(e), next(n) {}; }; //单链表list类创建 class List { protect...

以下是使用另一种方法实现该代码的修改版:

#ifndef NULL
#define NULL 0
#endif
#include<iostream>
using namespace std;

//定义单链表结点结构
struct LNode {
    int data;
    LNode* next;
    LNode() {};
    LNode(int e, LNode* n = NULL) :data(e), next(n) {};
};

//单链表list类创建
class List {
protected:
    LNode* head;
    int _size;
public:
    //构造函数
    List() {
        head = new LNode;
        head->next = NULL;
        _size = 0;
    }

    //析构函数
    ~List() {
        while (head->next) {
            LNode* p = head->next;
            head->next = p->next;
            delete p;
        }
        delete head; // 删除头结点
    };

    //在链表头部插入元素
    void insert(int& e) {
        _size++;
        LNode* p = new LNode(e, head->next);
        head->next = p;
   }

   //在指定位置插入元素
   void insert(int index, int a) {
       if (index < 1 || index > _size + 1)
           return; //无效的插入位置,直接返回

       _size++;

       LNode* p = head;

       //移动p到要插入位置的前一个节点
       for (int i = 1; i < index; i++)
           p = p->next;

       LNode* tmp = new LNode(a);
       tmp->next = p->next;
       p->next = tmp;
   }

   //打印链表
   void print_L() {
       LNode* p = head->next;
       while (p != NULL) {
           cout << p->data << " ";
           p = p->next;
       }
       cout << endl;
   }

   //交换两个节点位置
   int change() {
       int x, y;
       cin >> x >> y;
       if (x < 0 || x > _size || y < 0 || y > _size) {
           cout << "error" << endl;
           return -1;
       }

       if (x == y) // 如果x和y相同,不进行交换操作
           return 0;

       LNode* px_prev = head; // 节点x的前一个节点指针
       for (int i = 1; i < x; i++)
           px_prev = px_prev->next;

       LNode* py_prev = head; // 节点y的前一个节点指针
       for (int i = 1; i < y; i++)
           py_prev = py_prev->next;

        LNode* px = px_prev->next; // 节点x指针
        LNode* py = py_prev->next; // 节点y指针

        px_prev->next = py;
        py_prev->next = px;

        LNode* tmp_next = px->next; // 暂存节点x的下一个节点指针
        px->next = py->next;
        py->next = tmp_next;

        return 0;
    }
};

int main() {
    List LB;
    int n, a;
    cin >> n;

    for (int i = 0; i < n; i++) {
        cin >> a;
        LB.insert(i + 1, a);
    }

    LB.print_L();
    int t;
    cin >> t;

    for (int i = 0; i < t; i++) {
        int a = LB.change();
        if (a == -1)
            continue;
        LB.print_L();
    }	
}

这个修改版将原来的头插法改为了在链表头部插入元素,同时对节点位置交换的逻辑进行了修正。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9579

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?