以下是使用另一种方法实现该代码的修改版:
#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助手提供,问题来源于学员提问