链表————90.双向链表的逆置

2024-02-06 07:32
文章标签 链表 双向 逆置 90

本文主要是介绍链表————90.双向链表的逆置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

要求说明:实现创建一个双向链表,将双向链表的节点逆置,即将尾节点放到第一个节点的位置,倒数第二个放到第二个节点的位置。依次类推,,并将结果输出。

ps:相对应的双向链表的逆序输出,只要用一个指针遍历到最后一个节点,然后,通过前驱的移位遍历,即可输出,这里就不加入代码了

//双链表逆置
#include <stdio.h>
#include <stdlib.h>


#define N 10


typedef struct node                 //定义结构体,双链结构
{
    char name[20];
    struct node *prior,*next;
}stud;
stud * create(int n)                //双链表创建
{
    stud *p,*h,*s;
    int i;
    h = (struct node *)malloc (sizeof(struct node));        //头节点建立
    h -> name[0] = '\0';                                    //初始化头节点
    h -> prior = NULL;
    h -> next = NULL;
    p = h;                                                  //p指向头节点
    printf("input the records:\n");
    for( i = 1; i <= n; i ++)               
    {
        s = (stud *) malloc (sizeof(stud));                 //申请空间
        scanf("%s",s -> name);                              //数据输入
        p -> next = s;                                      
        s -> prior = p;                                      //指向前驱节点
        s -> next = NULL;                                   //指向后继节点
        p = s;
    }


    return h;                                               //返回头节点
}


stud * reverse(stud *head)      //逆置子函数
{
    stud *p, *r ,*h;
    h = head -> next;           //非头节点的第一个节点 
    if(h && h -> next)          //判断是否第二个节点有存在,存在则进行逆置
    {
        p = h;                  //p指向h
        r = p -> next;          //r指向p的后继
        p -> next = NULL;       //给p的后继赋空,因为逆置,所以此时的p将会是逆置后的最后一个节点
        while(r)                //将p后的节点依次取出放到h的前驱
        {
            p = r;
            r = r->next;
            p -> next = h;
            h -> prior = p;
            h = p;
        }
        head -> next = h;       //头节点指向后继h
        h->prior = head;        //h前驱指向头节点
        return head;            //返回头节点
    }
}
int main(int argc, char **argv)
{
    int n,i;
    int x;
    stud *q;
    printf("input the count of the nodes you want to creat:");  //输入创建的节点数目
    scanf("%d",&n);                     
    q = create(n);              //完成创建
    q = reverse(q);             //完成逆置
    printf("the result linklist:\n");   //逆置后输出
    q = q -> next;
    while(q)
    {
        printf("%s ",&*(q->name));
        q = q->next;
    }
    return 0;
}

样例输入输出:

input the count of the nodes you want to creat:5
input the records:
1 2 3 4 5
the result linklist:
5 4 3 2 1

这篇关于链表————90.双向链表的逆置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/683576

相关文章

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

90、k8s之secret+configMap

一、secret配置管理 配置管理: 加密配置:保存密码,token,其他敏感信息的k8s资源 应用配置:我们需要定制化的给应用进行配置,我们需要把定制好的配置文件同步到pod当中容器 1.1、加密配置: secret: [root@master01 ~]# kubectl get secrets ##查看加密配置[root@master01 ~]# kubectl get se

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

react笔记 8-19 事件对象、获取dom元素、双向绑定

1、事件对象event 通过事件的event对象获取它的dom元素 run=(event)=>{event.target.style="background:yellowgreen" //event的父级为他本身event.target.getAttribute("aid") //这样便获取到了它的自定义属性aid}render() {return (<div><h2>{

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结,删除链表节点问题使用到列表,哈希表,递归比较容易超时,我觉得使用计数排序比较稳,处理起来也不是很难。 1. 力扣3217:从链表中移除在数组中的节点 1.1 题目: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。 示例 1: 输入: nums = [1,2,3], head = [1,2,3,

c++ 链表详细介绍

链表是数据结构的一种,由节点组成,每个节点包含数据和指向下一个节点的指针。链表在C++中的实现可以是单链表、双链表或循环链表。以下是链表的详细介绍: 1. 单链表 结构: 节点(Node):每个节点包含数据和一个指针(next),指向链表中的下一个节点。 示例结构: struct Node {int data;Node* next;Node(int d) : data(d), next(