交换链表中相邻的两个结点
描述
利用单链表表示一个整数序列,请设计算法在空间复杂度为O(1)的前提下,两两交换其中相邻的结点。
注意:需要进行实际的结点交换,不可以仅改变结点内部的值。
输入
多组数据,每组数据有两行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔),当n=0时输入结束。
输出
对于每组数据分别输出一行,输出操作后的链表元素(元素之间用空格分隔)。
输入样例 1
4 1 2 3 4 5 5 2 6 3 6 5 2 7 1 4 1 1 2 0
输出样例 1
2 1 4 3 2 5 3 6 6 7 2 4 1 1 2
#include<iostream>
using namespace std;
typedef struct LNode {
int data;
struct LNode* next;
}LNode,*LinkList;
void Create(LinkList& L, int n) {
L = new LNode;
L->next = NULL;
LNode* s, * r = L;
for (int i = 0; i < n; i++) {
s = new LNode;
cin >> s->data;
r->next = s;
r = s;
}
r->next = NULL;
}
void Change(LinkList& L,int n) {
int i = 1;
LNode* p = L->next,*s=L->next;
LNode* r,* q=L;
while (p) {
if (i % 2 == 0) {
while (s->next != p) {
s = s->next;
}
r = p;
p = p->next;
q->next = r;
r->next = s;
q = s;
q->next = NULL;
s = p;
i++;
}
else {
if(p->next==NULL){
q->next = p;
}
p = p->next;
i++;
}
}
}
void Print(LinkList& L) {
LNode *p = L->next;
while (p) {
if (p->next) {
cout << p->data << " ";
}
else {
cout << p->data << endl;
}
p = p->next;
}
}
int main() {
int n;
while (cin >> n && n != 0) {
LinkList L;
Create(L, n);
Change(L,n);
Print(L);
}
}