颠倒一个链表的顺序 C++
来源:互联网 发布:dnf画质优化 编辑:程序博客网 时间:2024/05/22 03:38
首先我们定义一个头结点:
struct Node{int data;Node*next;};接下来我们写一个函数来创建一个链表:
//a是一个数组,n代表数组元素的个数Node*createLinkList(int a[],int n){ if(a==NULL||n==0) return NULL; Node*L,*T=NULL; for(int i=0;i<n;i++) { if(i==0) {L=new Node; L->data=a[i]; L->next=NULL; T=L; }else { Node*s=new Node; s->data=a[i]; s->next=NULL; T->next=s; T=s;//结点移动 } } return L;}下面就开始我们的翻转方法部分
1)首先我们先用递归方法来进行处理
(1)如果一个链表为空链表,那么他的逆序还是为空
(2)如果一个链表中只有一个节点,那么他的逆序就是这个链表本身.
(3)如果一个链表的长度大于一,那么我们做如下递归.
把当前链表的除了头节点L之外的剩余节点组成的链表逆序,也就是递归调用,并得到剩余链表逆序后的头结点p,
此时将L的下一个节点的的next指向L, 并将L的next指针置空.然后返回p.
(简单来说,先是一层层寻找,找到尾结点返回给p,然后返回上一层,这时最后一个节点为L->next,将L->next的next指向现在第二层的L,然后再把L的next置空,即完成了第一次翻转,然后再返回给p;把这次的两个结点看成最后一个,然后在倒数第三层重复反转,最后完成整个反转)
Node*reverseLinkList(Node*L){ if(L==NULL) return NULL;if(L->next==NULL) return L;Node*p=reverseLinkList(L->next);L->next->next=L;//倒数第一个指向倒数第二个L->next=NULL;//倒数第二个指针置空return p;}2)第二种方法就不进行递归进行翻转,然而我们直接在最后翻转会出现断链,进而不能进行连续遍历,所以我们可以定义三个结点,pnow指向当前结点,pre指向它的前置,nex指向它的后驱,首先令pnow的下一个指针指向nex,然后令pnow的next拆掉并连接pre,进行翻转,这时pnow和nex之间是断开的,然后将pnow设置为前驱pre,将nex设置为pnow,即完成了一段翻转,重复到完毕即可。
Node*noreverseLinkList(Node*L){if(L==NULL||L->next==NULL) return L;Node*pnow=L,*pre=NULL,*nex=NULL,*tail=NULL;while(pnow!=NULL){nex=pnow->next;if(NULL==nex){tail=pnow;}pnow->next=pre;pre=pnow;pnow=nex;}return tail;}
为了验证,我们还要写一个显示函数:
void display(Node*L){ Node*p=L;if(p==NULL) return ;while(p!=NULL){cout<<p->data<<" ";p=p->next;}cout<<endl;}
下面是我的完整代码:
#include<iostream>using namespace std;struct Node{int data;Node*next;};//a是一个数组,n代表数组元素的个数Node*createLinkList(int a[],int n){if(a==NULL||n==0)return NULL;Node*L,*T=NULL;for(int i=0;i<n;i++){if(i==0){L=new Node;L->data=a[i];L->next=NULL;T=L;}else{Node*s=new Node;s->data=a[i];s->next=NULL;T->next=s;T=s;//结点移动}}return L;}void display(Node*L){ Node*p=L;if(p==NULL) return ;while(p!=NULL){cout<<p->data<<" ";p=p->next;}cout<<endl;}Node*reverseLinkList(Node*L){ if(L==NULL) return NULL;if(L->next==NULL) return L;Node*p=reverseLinkList(L->next);L->next->next=L;//倒数第一个指向倒数第二个L->next=NULL;//倒数第二个指针置空return p;}Node*noreverseLinkList(Node*L){if(L==NULL||L->next==NULL) return L;Node*pnow=L,*pre=NULL,*nex=NULL,*tail=NULL;while(pnow!=NULL){nex=pnow->next;if(NULL==nex){tail=pnow;}pnow->next=pre;pre=pnow;pnow=nex;}return tail;}int _tmain(int argc, _TCHAR* argv[]){ int a[] = {1,2,3,4,5,6}; int b[] = {1,2,3,4,5,6,7}; Node *L = createLinkList(a,6); display(L);display(noreverseLinkList(L));Node *A = createLinkList(b,7); display(reverseLinkList(A));system("pause");return 0;}谢谢阅读。详细解读:(有图理解)http://blog.csdn.net/zhaoruixiang1111/article/details/49932603
阅读全文
0 0
- 颠倒一个链表的顺序
- 颠倒一个链表的顺序 C++
- 用一种算法来颠倒一个链接表的顺序
- 颠倒一个句子中的词的顺序
- 颠倒字符串的顺序
- 颠倒链接表顺序
- To_10_r_100_8_3---颠倒一个链接表的顺序(递归以及非递归方式)
- 第4题 颠倒一个句子中的词的顺序
- 颠倒单词的出现顺序
- 颠倒句子中词的顺序
- 链表的颠倒算法
- java将一个数组顺序颠倒
- 颠倒一个句子中的词的顺序。比如: I am a student颠倒后变成:student a am I.
- C语言程序设计习题1-19 编写函数reverse(s),实现字符串的倒序,并用该函数每次颠倒一个输入行中的字符顺序
- PHP字符串颠倒顺序的函数
- 给定一个字符串,你需要颠倒每个单词中的字符顺序,同时仍然保留空白和初始的字顺序。
- 每天三道冲刺工作--用一种算法来颠倒一个链接表的顺序。现在在不用递归式的情况下做一遍。
- 颠倒字符串顺序 Reverse the C-style string
- chrome64滚动链及overscroll-behavior
- ubuntu14.04 install gazebo
- Decision Tree
- HP gen8 服务器快速搭建Centos 7 + lnmp 测试环境
- Linux 下的格式化输出命令:print
- 颠倒一个链表的顺序 C++
- mybatis基础知识(第三更)
- 指向数组的指针【注意】
- Scrapy爬取网易云音乐和评论(二、Scrapy框架每个模块的作用)
- mysql基本的查询语法,持续更新中ing...
- Jmeter 测试 RabbirMQ 性能
- PHP中IP地址处理
- mybatis 根据 数据库表 自动生成 实体
- scrollToBottom、scrollToTop、scrollToPercentVertical 等设置无效