以下是使用另一种方法实现该代码,使用双指针法进行插入和交换操作:
”`cpp
#ifndef NULL
#define NULL 0
#endif
#include
//定义单链表结点结构 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;
void init() {
head = new LNode;
head->next = NULL;
_size = 0;
}
public:
//构造函数
List(){init();}
//析构函数
~List() {
LNode* p = head;
while (head)
{
p = p->next;
delete head;
head = p;
}
};
//头节点
List(int info) { //使用头结点储存某些信息,不随链表插入改变位置
init();
head->data = info;
}
int& info() { return head->data; } //返回链表头结点的信息
//在指定位置插入元素(双指针法)
void insert(int index, int a)
{
if (index < 1 || index > _size + 1)
{
return; // 无效的插入位置,直接返回
}
LNode* prev = nullptr; // 前一个节点指针
LNode* curr = head; // 当前节点指针
LNode* tmp = new LNode(a); // 新插入的节点
// 找到要插入位置的前一个节点和当前节点
for (int i = 1; i < index && curr; i++)
{
prev = curr;
curr = curr->next;
}
tmp->next = curr; // 新插入节点指向当前节点
if (prev)
prev->next = tmp; // 前一个节点指向新插入节点
else
head->next = tmp; // 头结点指向新插入节点
_size++;
}
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;
}
LNode *curr_x, *prev_x, *curr_y, *prev_y;
curr_x = prev_x = head;
for (int i = 1; i <= x && curr_x != nullptr; i++)
{
prev_x=curr_x ;
curr_x=curr_x ->next ;
}
curr_y = prev_y= head;
for (int j = 1; j <= y && curr_y != nullptr ; j++)
{
prev_y=curr_y ;
curr_y=curr_y ->next ;
}
if (curr_x == nullptr || curr_y == nullptr )
{
cout << "error" << endl;
return -1;
}
if(curr_x!=head)
prev_x->next = curr_y;
else
head->next=curr_y;
prev_y->next = curr_x;
LNode *tmp = curr_x->next;
curr_x->next = curr_y->next;
curr_y->next = tmp;
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助手提供,问题来源于学员提问