反向打印链表(递归)

news/2025/2/22 16:24:07

反向打印链表(递归)

每次向下递归直到链表为空,向上返回,依次输出当前结点的值

代码实现

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>


typedef int Elemtype;

//单链表

typedef struct LNode
{
    Elemtype data;//存放数据
    struct LNode *next; //指向LNode的一个指针

} LNode,*LinkList; //相当于取别名,LNode代表一个节点,LinkList代表整个单链表(指向LNode的一个指针)

void PrintList(LinkList L)
{
    LinkList p;
    p=L->next;//找到头指针指向节点,开始遍历
    printf("链表元素如下:\n");
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}


//尾插法
LinkList List_TailInsert(LinkList L)
{
    int x;
    L=(LinkList)malloc(sizeof(LNode));
    LNode *r=L,*s;
    scanf("%d",&x);

    while(x!=9999)
    {
        s=(LNode*)malloc(sizeof(LNode));
        s->data=x;
        r->next=s;
        r=s;
        scanf("%d",&x);
    }
    r->next=NULL;
    return L;
}


void R_Print(LinkList L)
{
    if(L->next!=NULL){
        R_Print(L->next);
    }
     if(L!=NULL)printf("%d--->",L->data);
}

void R_Ignore_Head(LinkList L)
{
    if(L->next!=NULL) R_Print(L->next);//由于头节点无法输出data,所以传入L->next首结点开始
}

int main()
{
    LinkList L;//使用头插法 这里的L就是一个头指针
    printf("请输入链表元素,输入9999表示结束\n");
    L=List_TailInsert(L); // 1 2 3 4
    PrintList(L);
    printf("反向打印链表\n");
    R_Ignore_Head(L);


    return 0;
}



http://www.niftyadmin.cn/n/860292.html

相关文章

原地逆转链表

头插法原地逆转链表 根据头插法特性,将原来链表断开,重新使用头插法,新建 //头插法逆转链表 LinkList Reverse_List(LinkList L) {LNode *p,*r;pL->next;L->nextNULL;//将L置空,重新开始while(p!NULL){rp->next;p->nextL->next;L->nextp;pr;}return L; }指针…

插入排序使得链表有序

#include <stdio.h> #include <stdlib.h> #include<stdbool.h>typedef int Elemtype;//单链表typedef struct LNode {Elemtype data;//存放数据struct LNode *next; //指向LNode的一个指针} LNode,*LinkList; //相当于取别名,LNode代表一个节点,LinkList代表…

寻找两个链表共同结点

寻找两个链表共同结点 这个相同结点是指,中间某个结点的next指针,指向同一片区域,并不是仅仅元素值相同 解决步骤 1、使用两个指针,先求出L1,L2的长度 2、先用一个指针p,将长链表,遍历到和短链表相同长度(p每次向后移动) 3、两个指针同时一起向后移动,直到指向相同结点位置 实现…

链表重构(两个经典例题)

题目一 将链表{a1,b1,a2,b2,a3,b3…an,bn}转换为{a1,a2…an}、{bn,bn-1…b1}b为逆序(逆序使用头插法) 解题思路 #include <stdio.h> #include <stdlib.h> #include<stdbool.h>typedef int Elemtype;typedef struct LNode {Elemtype data;struct LNode *next…

线段树(常用操作)

模板题目 #include <bits/stdc.h>#define ll long long #define pr pair<double,int> using namespace std;const int maxn2e510; int ans,m,n,p;struct node {int l,r;int v;//区间[l,r]最大值} tr[maxn*4]; //由于第1层到第n-1层满二叉树有2n-1个结点(第n-1层n个…

删除有序链表中重复元素

删除有序链表中重复元素 使用两个指针,p用来遍历链表,q每次指向p的下一个位置,若p->dataq->data则删除q 实现代码 #include <stdio.h> #include <stdlib.h> #include<stdbool.h>typedef int Elemtype;typedef struct LNode {Elemtype data;struct LN…

寻找两个递增有序链表的交集

寻找两个递增有序链表的交集 利用两个指针p、q遍历两个链表,当p的元素等于q的元素值时,添加进入结果链表中,如果p的数据小于q的数据时,p向下移动,否则q向下移动 实现代码 #include <stdio.h> #include <stdlib.h> #include<stdbool.h>typedef int Elemtype;…

判断B链表是否为A链表的子序列

判断B链表是否为A链表的子序列 类似与字符串中判断是否为子串问题,从两个链表的第一个结点开始,若对应数据相等,则指针后移,若对应数据不等,则A链表从上次开始比较结点后继开始,B仍然从第一个结点开始比较 实现代码 #include <stdio.h> #include <stdlib.h> #incl…