链表实现逆置

来源:互联网 发布:vue.js prop 编辑:程序博客网 时间:2024/06/06 19:08

以 1,2,3,4,5为举例

主要的算法部分:

p=L->next;//p指向L的下一个结点,即为1的位置
L->next=NULL;//把头结点和1之间断开
while(p!=NULL)//循环结束的条件
{
    q=p;//Q也指向p的位置
    p=p->next;//p再指向2的位置
    q->next=L->next;//q的下一个指向空
    L->next=q;//L的next再指向1(第一次的循环只把头指针和1先断开,再链接起来,其余以此类推)
}//这是算法的非递归实现

代码的具体实现://递归算法的实现

#include"stdio.h"
const int N=6;
typedef struct node
{
    int data;
    struct node *next;
}LinkedNode,*LinkList;
LinkList CreateList(int a[N])//创建一个单链表
{
    LinkedNode *head=new LinkedNode();//清空头结点
    head->data=a[0];//头结点放第一个数据
    head->next=NULL;
    for(int i=N-1;i>=1;i--)
    {
        LinkedNode *p=new LinkedNode();
        p->data=a[i];//数据域存放数据
        p->next=head->next;//指针域存放next的指针
        head->next=p;
    }
    return head;
}
void PrintList(LinkList head)
{
    if(NULL==head)
        printf("The List is empty!\n");
    else
    {
        LinkedNode *p=head;
        while(p!=NULL)
        {
            printf("%d ",p->data);//输出一个数据
            p=p->next;//指向下一个结点的位置
        }
        printf("\n");
    }
}
void ReverseList(LinkedNode *pcur,LinkList &head)//链表逆置,头指针会发生变化
{
    if(NULL==pcur||NULL==pcur->next)
        head=pcur;
    else
    {
        LinkedNode *pnext=pcur->next;//指向该数据的下一个数据的位置
        ReverseList(pnext,head);
        pnext->next=pcur;
        pcur->next=NULL;
    }
}
int main()
{
    int a[N]={1,2,3,4,5,6};
    LinkedNode *list=CreateList(a);//创建一个链表
    PrintList(list);//输出该链表
    LinkedNode *ptemp=list;
    ReverseList(ptemp,list);
    PrintList(list);//输出该链表
    return 0;
}

0 0