描述

利用双向循环链表表示一个整数序列,指定一个结点位置用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;
}

双向循环链表中结点的交换(C++)相关推荐

  1. 在双向循环链表中,在p所指的结点之后插入s指针所指的结点,其操作是?

    题目: 在双向循环链表中,在p所指的结点之后插入s指针所指的结点,其操作是( D ) A p->next=s; s->prior=p; p->next->prior=s; s- ...

  2. 【数据结构】- 几个步骤教你认识并实现一个链表之带头(哨兵位)双向循环链表(中)

    文章目录 前言

  3. 数据链表:双向循环链表交换结点

    要求:已知p指向双向循环链表中的一个结点,其结点结构为data.prior.next三个域,写出算法change§,交换p所指向的结点和它的前缀结点的顺序. [题目分析] 知道双向循环链表中的一个结点 ...

  4. 数据结构——带头结点双向循环链表

    相比较与单链表,双向循环链表每个结点多了一个prev指针域,用于指向该结点的前驱,并且链表的头尾结点也用指针域相连.所以对于带头结点的双向循环链表的判空条件为head->next=head;除此 ...

  5. 双向循环链表的插入与删除

    关于解释部分不再多说了,网上资料很多,下面就介绍具体的实现吧 //双向循环链表的插入与删除 typedef struct node{     int data;     struct node *pr ...

  6. 双向循环链表:维吉尼亚密码

    维吉尼亚密码简介 维吉尼亚密码引入了"密钥"的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计.假如下面图第一行代表明文字母,左面第一列代表密钥字母,对如下明文加 ...

  7. 双向循环链表:字母表实现前后移动

    问题描述 要求实现用户输入一个数使得26个字母的排列发生变化,例如用户输入3,使得结果为:DEFHIJKLMNOPQRSTUVWXYZABC, 同时需要支持负数,使得输入-3时,结果为:XYZABCD ...

  8. 详解Linux内核之双向循环链表 By邪恶八进制

    [转载]详解Linux内核之双向循环链表 详解Linux内核之双向循环链表 信息来源:邪恶八进制信息安全团队(www.eviloctal.com) 摘要:      本文详解了内核中面向对象的list ...

  9. C语言实现链表【二】带头双向循环链表

    带头双向循环链表 结构描述: 带头双向循环链表:结构最复杂,一般用在单独存储数据.实际中使用的链表数据结构,都是带头双向循环链表.另外这个结构虽然结构复杂,但是使用代码实现以店会发现结构会带来很多优势 ...

最新文章

  1. hdu 2602 Bone Collector
  2. linux 用户态 隐藏进程 简介
  3. [na]vrrp两用(网关冗余+服务器热备)
  4. 博图v16组态wincc_西门子WinCC与S71200OPC通讯方法
  5. 描写计算机老师上课的神态,请你用一段话描写一位老师上课的情景,注意抓住神态语言动作等细节...
  6. python质量转换程序,Python库的文件转换成MP3和设置它们的质量
  7. sql server中的注释快捷键
  8. 2d头发_3D打印毛囊突破性进展!“头发工厂”将成秃顶的救星
  9. 超柔磨绒印花空调被(200*230cm) -凡客诚品工商银行团购专区- VANCL凡客诚品
  10. Centos7 虚拟机迁移及扩容
  11. 一篇文章教你,破解百度网盘加密文件,学会这个举一反二
  12. 限定通配符和非限定通配符_什么是通配符?
  13. 1 Markdown操作笔记
  14. 暴力破解防范措施和措施总结
  15. Mac电脑浏览器无法上网
  16. invalid index of a 0-dim tensor
  17. 安装html5 win7,win7官方正版64位系统安装教程
  18. 虎牙、斗鱼同道同命:共同御寒
  19. 博客园背景滴墨水特效
  20. 22-08-08 西安 尚医通(04)MongoDB命令、MongoTemplate、MongoRepository

热门文章

  1. CSS--背景样式---伪类选择器---高级选择器---盒子模型---浮动
  2. 二十一 JDK注解注解案例
  3. 进程间通讯(一)--邮件槽
  4. 解决firefox的button按钮文字不能垂直居中
  5. 如何解决系统补丁(KB971092)重复安装问题
  6. 查了一晚上的资料,累啊。
  7. java基础—IO流——字节流的操作演示
  8. 前后端分离 ---购物车
  9. 【UOJ139】【UER #4】被删除的黑白树
  10. Django+xadmin 打造线上教育平台(二)-1(旧)