颠倒一个链表的顺序 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
原创粉丝点击