#include using namespace std; #pragma region C++实现的单链表通用模板 // https://blog.csdn.net/wonggonghong/article/details/21716597 // C++实现的单链表通用模板 // https://blog.csdn.net/wonggonghong/article/details/21527577 //创建一个单链表结构,包含一些常见的操作 struct Node { int element; //节点存储信息可以根据需要修改! Node *next; }; //创建一个空表,并返回表头 Node *CreateLists() { Node *head = new Node; head->next = NULL; return head; } //删除表头为head的该链表 void DeleteLists(Node *head) { Node *P = head->next, *temp; head->next = NULL; while (P) { temp = P->next; delete P; P = temp; } } //判断是不是最后一个链表节点 bool IsLast(Node *P) { return P->next == NULL; } //按值X进行查询,找到第一个 Node *Find(int X, Node *head) { Node *P = head->next; while (P && P->element != X) P = P->next; return P; } //按值X进行查询,找到符合条件的前一个节点 Node *FindPrevious(int X, Node *head) { Node *P = head; while (P->next && P->next->element != X) P = P->next; return P; } //按值X进行删除 void Delete(int X, Node *head) { Node *P = FindPrevious(X, head), *temp; //如果没找到X,则返回的是链表最后一项 if (P->next) { temp = P->next; P->next = temp->next; delete temp; } } //在节点P后面插入X void Insert(Node *P, int X) { Node *tempX = new Node; tempX->element = X; tempX->next = P->next; P->next = tempX; } //输出链表中所有元素的值 void OutputLists(Node *head) { Node *P = head->next; while (P) { std::cout << P->element << " "; P = P->next; } std::cout << std::endl; } // 带头节点的单链表元素互换 void DoExchange(Node *A, Node *B, Node *head) { if (A == B) return; Node *PreA = FindPrevious(A->element, head); Node *PreB = FindPrevious(B->element, head); Node *PostA = A->next; Node *PostB = B->next; //先考虑A、B节点相邻的情况 if (PostA == B) { PreA->next = B; B->next = A; A->next = PostB; return; } if (PostB == A) { PreB->next = A; A->next = B; B->next = PostA; return; } //再考虑其他情况 PreA->next = B; B->next = PostA; PreB->next = A; A->next = PostB; } #pragma endregion C++实现的单链表通用模板 int main() { int n, m, p; cin >> n >> m >> p; //头节点 Node *head = CreateLists(); Node *P = head; //P为一个链表的指针,用它来进行移动 //读入第一个数字,做为head头 cin >> head->element; //第二行为n个不相同的数字-->创建链表 for (int i = 1; i < n; i++) { int temp; cin >> temp; //插入数据 Insert(P, temp); //P为移动的指针,Data[i]为每一个数据 //移动P,方便下一次插入数据 P = P->next; } //处理m行读入数据 for (int i = 0; i < m; ++i) { int a, b; cin >> a >> b; //交换两个位置的数据 Node *A = head; Node *B = head; for (int j = 1; j < a; ++j) { A = A->next; } for (int j = 1; j < b; ++j) { B = B->next; } DoExchange(A, B, head); } //输出第p个位置的数字 Node *A = head; for (int i = 1; i < p; ++i) { A = A->next; } cout << A->element << endl; return 0; }