以下是使用另一种方法实现相同功能的代码,其中单链表结点结构和 List 类的定义保持不变:
#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)
{
LNode* p = head->next;
delete head;
head = p;
}
};
//在指定位置插入元素
void insert(int index, int a)
{
if (index < 1 || index > _size + 1)
{
return; // 无效的插入位置,直接返回
}
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;
_size++;
print_L(); // 打印链表元素值(调试用)
return; // 插入成功
}
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) // 如果交换位置相同,直接返回
return 0;
LNode* px_prev = head; // 第一个要交换的结点的前一个结点
for (int i = 0; i < x - 1; i++)
{
px_prev = px_prev->next;
}
LNode* py_prev = head; // 第二个要交换的结点的前一个结点
for (int j = 0; j < y - 1; j++)
{
py_prev = py_prev->next;
}
LNode* px = px_prev->next; // 第一个要交换的结点
LNode* py = py_prev->next; // 第二个要交换的结点
LNode* tmp_next_px = px->next; // 记录第一个要交换结点后续的指针
px_prev->next = py; // 将第二个要交换的结点链接到第一个要交换结点之前(px之前)
if(px == py_prev) { // 如果两个要交换的结点相邻
px->next = py->next; // 将第二个要交换结点的后续指针链接到第一个要交换结点之后(py之后)
} else {
px->next = py->next; // 将第二个要交换结点的后续指针链接到第一个要交换结点之后
py_prev->next = px; // 将第一个要交换的结点链接到第二个要交换结点之前(py之前)
}
py->next = tmp_next_px; // 将记录的px后续指针链接到py之后
print_L(); // 打印链表元素值(调试用)
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);
}
int t;
cin >> t;
for (int i = 0; i < t; i++)
{
int a = LB.change();
if (a == -1)
continue;
}
return 0;
}
这段代码通过在指定位置插入元素来构建单链表,实现了两个节点位置交换的功能。
内容由零声教学AI助手提供,问题来源于学员提问