zoukankan      html  css  js  c++  java
  • 反转单链表

    分析:

      初始化三个指针p1,p2,p3. p1指向当前结点,p2指向当前结点的下一个结点,p3指向当前结点的上一个结点。则初始值p1,p2,p3分别是:p1指向第一个结点,p2指向第二个结点,p3指向p1的上一个结点,则p1的初始值为NULL。

    逆序后p1->next = p3.

      紧接着让p1,p2,p3指针向后移,重复以上操作p1->next = p3,直到p2为空。则p1就是单链表的最后一个结点,让单链表的头结点指向p1,就完成了单链表的逆序操作。

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int ElemType;
    
    //定义链表的存储结构
    typedef struct Node {
        ElemType data;
        struct Node *next;
    } Node;
    typedef struct Node *LinkList;
    typedef struct Node *pNode;
    
    //创建单链表(带头结点的单链表)
    LinkList createLinkList(int n, int isCycle);
    //单链表逆序
    int reverseLinkList(LinkList *L);
    //遍历单链表
    void traversalList(LinkList L);
    
    //创建单链表
    LinkList createLinkList(int n, int isCycle) {
        LinkList L = (pNode)malloc(sizeof(Node)); //头结点
        pNode p, r = L;
        ElemType e;
        for (int i = 0; i < n; i++) {
            printf("请输入第%d个数字", i + 1);
            scanf("%d", &e);
            p = (pNode)malloc(sizeof(Node));
            if (p == NULL) {
                printf("out of space");
                exit(1);
            }
            p->data = e;
            if (i == n-1 && isCycle == 1) {
                p->next = L;
            } else {
                p->next = NULL;
            }
            if (L == NULL) {
                L = p;
            } else {
                r->next = p;
            }
            r = p;
        }
        return L;
    }
    
    //单链表逆序
    int reverseLinkList(LinkList *L) {
        pNode p1, p2, p3;
        p1 = (*L)->next;    //p1指向第一个结点
        if (p1 == NULL) {   //链表为空
            return 0;
        }
        p2 = p1->next;      //p2指向第二个结点
        p3 = NULL;      //p3指向p1的前一个结点,故p3的初始值为NULL
        
        p1->next = p3;    //逆序后,p1的下一个结点就应该是p3    
        
        while (p2) {        
            p3 = p1;
            p1 = p2;
            p2 = p2->next;
            p1->next = p3;
        }
        (*L)->next = p1;
        return 1;
    }
    
    //遍历单链表
    void traversalList(LinkList L) {
        pNode p = L->next;
        while (p) {
            printf("%d", p->data);
            p = p->next;
        }
    }
    
    int main(int argc, const char * argv[]) {
        
        LinkList L = createLinkList(5, 0);
        traversalList(L);
        reverseLinkList(&L);
        traversalList(L);
        
        return 0;
    }
  • 相关阅读:
    Tensorflow 2.0 学习资源
    SpagoBI 教程 Lesson 5: Creating a dashboard with BIRT and SpagoBI
    SpagoBI 教程 Lesson 4: BIRT Reports
    SpagoBI 教程 Lesson 3: Highchart Dashboards
    SpagoBI 教程 Lesson 2: OLAP with JPIVOT
    SpagoBI 教程 Lesson 1:Introduction and Installation
    Oracle system表空间满的暂定解决方法
    运算符重载_继承_多态_模版
    成员函数返回的是对象和引用的区别(转)
    String类型_static成员_动态内存分配_拷贝构造函数_const关键字_友元函数与友元类
  • 原文地址:https://www.cnblogs.com/muzijie/p/5664527.html
Copyright © 2011-2022 走看看