链表就地逆置

来源:互联网 发布:网络变压器内部结构 编辑:程序博客网 时间:2024/04/18 11:45

  • 前言
    • 算法思路
    • Ubuntu 下的运行结果
    • 源代码

前言

对于这个链表的就地逆置算法感觉比较绕!今天就彻底的消灭了他。现将总结如下。
就地逆置,就是在不借助任何中间变量的情况下,逆置一单链表。

算法思路:

 逆置后的点链表初始为空,表中的节点不是新生成的,而是从原链表当中一次“删 除”,再逐个头插到逆置表中。设逆置链表的初始态为空表,“删除”已知链表中 的第一个节点,然后将它“插入”到逆置链表的“表头”,即使得他成为逆置链表 中“新”的第一个节点,如此循环,直至原链表为空。

假设有如下数据结构:

    #define ElemType char    typedef struct Node{        ElemType data;        struct Node *next;    }Node,*LinkList;

算法原理如下图所示
算法原理

核心算法

    void ReverseList(LinkList L){        Node *p,*q;        p = L->next;             /*p为原链表的当前处理节点*/        L->next = NULL;          /*逆置单链表初始为空*/        while(p != NULL){        /*当原链表未处理完*/            q = p->next;         /*q指针保留原链表当前处理节点的下一个节点*/            p->next = L->next;   /*将当前处理节点p插入到逆置L的表头*/            L->next = p;            p = q;               /*p指向下一个待插入的节点*/        }    }

其实也比较简单;就是有点绕。这里同时给出头插法建立链表的代码

    void CreatList(LinkList L){        Node *s;        char c;        int flag = 1;        while(flag){            c = getchar();            if(c != '$'){                s = (Node*)malloc(sizeof(Node));                s->data = c;                s->next = L->next;                L->next = s;            }else                flag = 0;        }    }

Ubuntu 下的运行结果

结果

源代码

#include <stdio.h>#include <stdlib.h>#include <string.h>#define ElemType chartypedef struct Node{    ElemType data;    struct Node *next;}Node,*LinkList;void InitList(LinkList *L);void ReverseList(LinkList L);void CreatList(LinkList L);void Print(LinkList L);int main(){    LinkList L;    InitList(&L);    CreatList(L);    Print(L);    ReverseList(L);    Print(L);    return 0;}void InitList(LinkList *L){    *L = ( LinkList )malloc(sizeof(Node));    (*L)->next = NULL;}void CreatList(LinkList L){    Node *s;    char c;    int flag = 1;    while(flag){        c = getchar();        if(c != '$'){            s = (Node*)malloc(sizeof(Node));            s->data = c;            s->next = L->next;            L->next = s;        }else            flag = 0;    }}void Print(LinkList L){    Node *r;    r = L->next;    while(r != NULL){        printf("%3c",r->data);        r = r->next;    }    printf("\n\n");}void ReverseList(LinkList L){    Node *p,*q;    p = L->next;    L->next = NULL;    while(p != NULL){        q = p->next;        p->next = L->next;        L->next = p;        p = q;    }}
0 0
原创粉丝点击