单链表的逆置

来源:互联网 发布:淘宝视频剪辑收费 编辑:程序博客网 时间:2024/05/18 02:42

    首先先来看一下链表的结构,如下图结构体所示,链表的节点包括两部分,数据域和指针域。

    typedef  struct Node

    {   

           int data;//数据域

           struct Node *next;//指向下一个节点

     }Node,*List;

    对于单链表的逆置有两种方法,第一种是改变指针方向,第二种是利用头插的思想,将数据节点依次头插进链表,就可以得到逆置后的链表。

    有以下单链表

   


    1、改变指针方向

void Reverse(List plist){    if(plist==NULL||plist->next==NULl||plist->next->next==NULL)    {        return;    }        Node *p=plist->next;//从第一个头结点开始    Node *q=p->next;    Node *s;    p->next=NULL;        while(q!=NULL)    {        s=q->next;        q->next=p;//改变指针方向        p=q;//指针后移        q=s;//指针后移    }        plist->next=p;}

     根据上图代码所示,在执行q->next=p这句代码时 就相当于指针转变了方向,由原来的p指向q,变成了q指向p,然后指针后移。如下图所示

           

    2、头插思想

void  Rsverse(List plist){    if(plist==NULL||plist->next==NULL||plist->next->next==NULL)    {        return;    }    Node *p=plist->next;    Node *q;    plist->next=NULL;        while(p!=NULL)    {        q=p->next;        p->next=plist->next;//将p头插进链表        plist->next=p;        p=q;    }}
     通过将每一个结点重新头插入链表,也能得到逆置的链表

    


原创粉丝点击