下面是使用C++实现含头结点的单链表,并实现单链表中元素位置移动的代码:
#include <iostream>
using namespace std;
// 定义单链表节点
struct ListNode {
int data;
ListNode* next;
};
// 创建含头结点的单链表
ListNode* createLinkedList(int n) {
ListNode* head = new ListNode; // 头结点
ListNode* p = head;
for (int i = 0; i < n; i++) {
int num;
cin >> num;
ListNode* newNode = new ListNode;
newNode->data = num;
newNode->next = NULL;
p->next = newNode;
p = p->next;
}
return head;
}
// 打印单链表
void printLinkedList(ListNode* head) {
if (head == NULL || head->next == NULL)
return;
ListNode* p = head->next;
while (p != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
// 移动节点位置
void moveNode(ListNode* head, int currentPos, int targetPos) {
if (head == NULL || head->next == NULL)
return;
if (currentPos <= 0 || targetPos <= 0)
return;
// 找到当前位置和目标位置的前一个节点
ListNode *p1_prev, *p2_prev, *p1, *p2;
p1_prev = head;
p2_prev = head;
for(int i=0;i<currentPos-1;i++)
{
p1_prev=p1_prev->next;
}
p1=p1_prev->next;
for(int i=0;i<targetPos-1;i++)
{
p2_prev=p2_prev->next;
}
p2=p2_prev->next;
// 若当前位置和目标位置相同,则单链表的顺序不变
if (p1 == p2)
return;
// 进行节点位置调换
p1_prev->next = p1->next;
p1->next = p2_prev->next;
p2_prev->next = p1;
}
int main() {
int n; // 链表中数据个数
cin >> n;
ListNode* head = createLinkedList(n);
cout << "Original List: ";
printLinkedList(head);
int t; // 移动次数
cin >> t;
cout << "Result:" << endl;
for(int i=0;i<t;i++)
{
int currentPos, targetPos;
cin >> currentPos >> targetPos;
moveNode(head, currentPos, targetPos);
printLinkedList(head);
}
return 0;
}
希望能够帮助到你!
内容由零声教学AI助手提供,问题来源于学员提问