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;
    }
  • 相关阅读:
    700. Search in a Binary Search Tree
    100. Same Tree
    543. Diameter of Binary Tree
    257. Binary Tree Paths
    572. Subtree of Another Tree
    226. Invert Binary Tree
    104. Maximum Depth of Binary Tree
    1、解决sublime打开文档,出现中文乱码问题
    移植seetafaceengine-master、opencv到ARM板
    ubuntu16.04-交叉编译-SeetaFaceEngine-master
  • 原文地址:https://www.cnblogs.com/muzijie/p/5664527.html
Copyright © 2011-2022 走看看