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;
    }
  • 相关阅读:
    虽然非常简单但是效果不错
    Google地图开发总结
    笔记(一):ES6所改良的javascript“缺陷”
    ex6的选择器
    android中的style部分属性值介绍
    Android ImageSwitcher
    c# Winform退出程序的方法
    Android ImageView获取网络图片
    循环向数据库(sql server)插入10W条数据
    Android Handler+Thread实现更新Ui
  • 原文地址:https://www.cnblogs.com/muzijie/p/5664527.html
Copyright © 2011-2022 走看看