单链表的逆置

来源:互联网 发布:西门子博图软件 编辑:程序博客网 时间:2024/05/22 10:22

概念:

将单链表倒序,即指针倒置,什么意思呢?就是这个意思:
这里写图片描述

其实就是原来的前驱节点变为后继节点,原来的后继节点变为前驱节点,头节点指向原来的尾节点

值得注意的是:这里的头结点的处理

实现思想:

利用头插法,将第一个节点后面的节点依次插在第一个节点之前。

方法:

  • 首先要声明两个指针变量,一个为位移指针(记录当前节点),一个为置换指针(即通常所说的temp);
  • 将头指针赋给位移指针,头指针置为空
  • 开始循环(在位移指针不为空的情况下)
  • 1:将当前的节点指针域值给置换指针
  • 2:将头节点指针域的指针域值给当前节点指针域
  • 3:将当前节点的地址给头节点指针域
  • 4:将置换指针值给当前节点(即位移指针向后移动)
    这样就完成了一个循环,就又可以循环了!

实现一个循环之后,结果是这个样子的:

这里写图片描述

每次循环之后的结果依次类推

算法代码

void Reverse(Linklist L){    Node *temp,*pre;    pre = L->next;    L->next = NULL;    while(pre){        temp = pre->next;        // 1        pre->next = L->next;     // 2        L->next = pre;           // 3        pre = temp;              // 4    }}

完整程序代码

#include<stdio.h>#include<malloc.h>typedef struct node    {        int data;        struct node *next;    }Node,*Linklist;Linklist CreatFromTail(){    printf("请输入数字,输入'0'时结束:\n");    Linklist L;    Node *s;    int x;    L=(Linklist)malloc(sizeof(Node));    L->next=NULL;    while(1)    {        scanf("%d",&x);        if(x!=0)        {            s=(Node *)malloc(sizeof(Node));            s->data=x;            s->next=L->next;            L->next=s;        }        else        {            break;        }    }    return L;}void Output(Linklist L){    Node *p;    p=L->next;    while(p)    {        printf("%d ",p->data);        p=p->next;    }    printf("\n");}void Reverse(Linklist L){    Node *temp,*pre;    pre = L->next;    L->next = NULL;    while(pre){        temp = pre->next;        pre->next = L->next;        L->next = pre;        pre = temp;    }}int main(){       Linklist L;    L=CreatFromTail();//创建单链表    Output(L);//打印输出单链表    Reverse(L);//逆置单链表    Output(L);  //输出逆置之后的链表    Reverse(L);  //再次逆置    Output(L);   //再次输出逆置之后的结果}
0 0
原创粉丝点击