描述
利用双向循环链表表示一个整数序列,指定一个结点位置用p指向该结点,交换p所指向的结点及其前驱结点的顺序。
输入
多组数据,每组数据有三行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔),第三行为p所指向的结点位置。当n=0时输入结束。
输出
对于每组数据分别输出一行,依次输出交换结点顺序后的链表元素,元素之间用空格分隔。
输入样例 1
5
44 11 22 33 55
3
6
22 33 11 66 44 55
6
0
输出样例 1
44 22 11 33 55
22 33 11 66 55 44
思路:
遍历一次找到要交换数据的两个节点,用最简单的那个方法只交换数据就行了,根本不用交换一整个节点呀XD~
注意如果是双向链表的话,就没有那个头节点了,所以头结点时要往里输入数据的,输入的时候要注意这里,相应地,for循环插入的时候也要记得少插一个,同时,不要忘了prior连上前面那个节点;插入结束后尾节点r不是指向NULL了,而是指向l(头节点)。
Change函数里,因为p移向下一个节点是比while快一次的,所以是 i<n-1 ,而不是 i<n 。
代码:
#include<string>
#include<iostream>
#include<map>
#include<vector>
#include<cmath>
#include<set>
#include<algorithm>
using namespace std;
typedef struct LNode
{
int data;
LNode* next;
LNode* prior;
}*linklist, LNode;
void TInsert(linklist& l, int n)
{
l = new LNode;
cin >> l->data;
l->next = NULL;
linklist r = l;
for (int i = 1; i < n; i++)
{
linklist p = new LNode;
cin >> p->data;
r->next = p;
p->prior = r;
r = p;
}
r->next = l;
l->prior = r;
}
void Change(linklist& l, int n)
{
linklist p = l;
int i = 1;
while (p && i < n-1 )
{
p = p->next;
i++;
}
int temp = p->data;
p->data = p->next->data;
p->next->data = temp;
}
void Show(linklist l)
{
linklist p = l;
cout << p->data << " ";
p = l->next;
while (p != l)
{
cout << p->data;
if (p->next != l)
cout << " ";
p = p->next;
}
cout << endl;
}
int main()
{
int n;
cin >> n;
while (n)
{
linklist l;
TInsert(l,n);
cin >> n;
Change(l, n);
Show(l);
cin >> n;
}
return 0;
}