双向循环链表中结点的交换(C++)
描述
利用双向循环链表表示一个整数序列,指定一个结点位置用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++)相关推荐
- 在双向循环链表中,在p所指的结点之后插入s指针所指的结点,其操作是?
题目: 在双向循环链表中,在p所指的结点之后插入s指针所指的结点,其操作是( D ) A p->next=s; s->prior=p; p->next->prior=s; s- ...
- 【数据结构】- 几个步骤教你认识并实现一个链表之带头(哨兵位)双向循环链表(中)
文章目录 前言
- 数据链表:双向循环链表交换结点
要求:已知p指向双向循环链表中的一个结点,其结点结构为data.prior.next三个域,写出算法change§,交换p所指向的结点和它的前缀结点的顺序. [题目分析] 知道双向循环链表中的一个结点 ...
- 数据结构——带头结点双向循环链表
相比较与单链表,双向循环链表每个结点多了一个prev指针域,用于指向该结点的前驱,并且链表的头尾结点也用指针域相连.所以对于带头结点的双向循环链表的判空条件为head->next=head;除此 ...
- 双向循环链表的插入与删除
关于解释部分不再多说了,网上资料很多,下面就介绍具体的实现吧 //双向循环链表的插入与删除 typedef struct node{ int data; struct node *pr ...
- 双向循环链表:维吉尼亚密码
维吉尼亚密码简介 维吉尼亚密码引入了"密钥"的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计.假如下面图第一行代表明文字母,左面第一列代表密钥字母,对如下明文加 ...
- 双向循环链表:字母表实现前后移动
问题描述 要求实现用户输入一个数使得26个字母的排列发生变化,例如用户输入3,使得结果为:DEFHIJKLMNOPQRSTUVWXYZABC, 同时需要支持负数,使得输入-3时,结果为:XYZABCD ...
- 详解Linux内核之双向循环链表 By邪恶八进制
[转载]详解Linux内核之双向循环链表 详解Linux内核之双向循环链表 信息来源:邪恶八进制信息安全团队(www.eviloctal.com) 摘要: 本文详解了内核中面向对象的list ...
- C语言实现链表【二】带头双向循环链表
带头双向循环链表 结构描述: 带头双向循环链表:结构最复杂,一般用在单独存储数据.实际中使用的链表数据结构,都是带头双向循环链表.另外这个结构虽然结构复杂,但是使用代码实现以店会发现结构会带来很多优势 ...
最新文章
- hdu 2602 Bone Collector
- linux 用户态 隐藏进程 简介
- [na]vrrp两用(网关冗余+服务器热备)
- 博图v16组态wincc_西门子WinCC与S71200OPC通讯方法
- 描写计算机老师上课的神态,请你用一段话描写一位老师上课的情景,注意抓住神态语言动作等细节...
- python质量转换程序,Python库的文件转换成MP3和设置它们的质量
- sql server中的注释快捷键
- 2d头发_3D打印毛囊突破性进展!“头发工厂”将成秃顶的救星
- 超柔磨绒印花空调被(200*230cm) -凡客诚品工商银行团购专区- VANCL凡客诚品
- Centos7 虚拟机迁移及扩容
- 一篇文章教你,破解百度网盘加密文件,学会这个举一反二
- 限定通配符和非限定通配符_什么是通配符?
- 1 Markdown操作笔记
- 暴力破解防范措施和措施总结
- Mac电脑浏览器无法上网
- invalid index of a 0-dim tensor
- 安装html5 win7,win7官方正版64位系统安装教程
- 虎牙、斗鱼同道同命:共同御寒
- 博客园背景滴墨水特效
- 22-08-08 西安 尚医通(04)MongoDB命令、MongoTemplate、MongoRepository