首页 > 其他分享 >C语言链表反转的四种方法

C语言链表反转的四种方法

时间:2024-10-30 10:22:53浏览次数:6  
标签:return C语言 next 链表 link end NULL 四种

//
// Created by Administrator on 2024/10/29.
//

#ifndef LINK_H
#define LINK_H
/**
 * 链表的结构体
 */
typedef struct Link {
    int element;
    struct Link *next;
} link;
#endif //LINK_H
//
// 四种链表反转算法
// Created by Administrator on 2024/10/29.
//

#pragma once
#include "Link.h"
#ifndef REVERSELIST_H
#define REVERSELIST_H


/**
 * 1. 迭代反转链表
 * @param p 初始链表
 * @return 反转后的链表
 */
link *iterationReverseLink(link *p);

/**
 * 2. 递归反转链表
 * @param p 初始链表
 * @return 反转后的链表
 */
link *recursiveReverseLink(link *p);

/**
 * 3. 头插法反转链表
 * @param p 初始链表
 * @return 反转后的链表
 */
link *headReverseLink(link *p);

/**
 * 4. 就地逆置法反转链表
 * @param p 
 * @return 
 */
link *localReverseLink(link *p);
#endif //REVERSELIST_H
//
// Created by Administrator on 2024/10/29.
//
#include "ReverseLink.h"

#include <malloc.h>
#include <stddef.h>
/**
 * 1. 迭代反转链表
 * @param p 初始链表
 * @return 反转后的链表
 */
link *iterationReverseLink(link *p) {
    /*链表为NULL或链表只有一个节点,直接返回*/
    if (p == NULL || p->next == NULL) return p;
    link *beg = NULL;
    link *mid = p;
    link *end = p->next;

    while (1) {
        mid->next = beg;
        if (end == NULL) {
            break;
        }
        /*向后移动指针*/
        beg = mid;
        mid = end;
        end = end->next;
    }
    p = mid;
    return p;
}

/**
 * 2. 递归反转链表
 * @param p 初始链表
 * @return 反转后的链表
 */
link *recursiveReverseLink(link *p) {
    /*链表为NULL或链表只有一个节点,直接返回*/
    if (p == NULL || p->next == NULL) return p;
    /*一直递归,找到链表中最后一个节点*/
    link *newP = recursiveReverseLink(p->next);
    p->next->next = p;
    p->next = NULL;
    return newP;
}

/**
 * 3. 头插法反转链表
 * @param p 初始链表
 * @return 反转后的链表
 */
link *headReverseLink(link *p) {
    /*链表为NULL或链表只有一个节点,直接返回*/
    if (p == NULL || p->next == NULL) return p;
    link *newP = NULL;
    link *temp = NULL;
    while (p != NULL) {
        temp = p;
        p = p->next;
        temp->next = newP;
        newP = temp;
    }
    return newP;
}

/**
 * 4. 就地逆置法反转链表
 * @param p
 * @return
 */
link *localReverseLink(link *p) {
    /*链表为NULL或链表只有一个节点,直接返回*/
    if (p == NULL || p->next == NULL) return p;
    link *begin = NULL;
    link *end = NULL;
    begin = p;
    end = p->next;
    while (end != NULL) {
        begin->next = end->next;
        end->next = p;
        p = end;
        end = begin->next;
    }
    return p;
}

 

标签:return,C语言,next,链表,link,end,NULL,四种
From: https://www.cnblogs.com/longfeiPHP/p/18515245

相关文章

  • L1-015 c语言跟奥巴马一起画方块
    美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!输入格式:输入在一行中给出正方形边长N(3≤N≤2......
  • 2个月搞定计算机二级C语言——真题(6)解析
    1.前言本篇我们讲解2个月搞定计算机二级C语言——真题62.程序填空题2.1题目要求2.2提供的代码#include<stdio.h>unsignedlongfun(unsignedlongn){unsignedlongx=0;intt;while(n){t=n%10;/**********fou......
  • 【C语言】预处理(预编译)详解(下)(C语言最终篇)
    文章目录一、#和##1.#运算符2.##运算符二、预处理指令#undef三、条件编译1.单分支条件编译2.多分支条件编译3.判断符号是否被定义4.判断符号是否没有被定义四、头文件的包含1.库头文件的包含2.本地头文件的包含3.嵌套包含头文件的解决方法使用条件编译指令使用预处理......
  • C语言之长整型有符号数与短整型有符号数转换
            最近考证的新星,问了一个问题:inta=1234565789;为什么在输出%hd时的值为-1379?其实这个很简单,只不过对于可能初入“编程坑”以及经验不是很丰富的朋友来说,感觉知道这么个道理,但就是解释不上来,无法做出实际的推论。作者想说的是,这个知识点亦涉及多方面,比较广泛,......
  • 初学c语言(第一天)
     其实我也不太算是初学,但是也算是初学,这样说有点矛盾哈,让我来解释一下: 首先我是一个今年刚刚毕业的大学生,大学学的专业是电子信息工程,这个专业涉及过c语言,但是我大学期间只顾的潇洒了,没怎么认真学习,只有当大四下学期的时候我们离校需要出去找工作实习时,我才发现我什么都不......
  • 实验3 C语言函数应用编程
    #include<stdio.h>charscore_to_grade(intscore);intmain(){intscore;chargrade;while(scanf("%d",&score)!=EOF){grade=score_to_grade(score);printf("分数:%d,等级:%c\n\n",score,gr......
  • 实验3_C语言函数应用编程
    任务一:#include<stdio.h>charscore_to_grade(intscore);intmain(){intscore;chargrade;while(scanf("%d",&score)!=EOF){grade=score_to_grade(score);printf("分数:%d,等级:%c\n\n",......
  • 复杂度分析,数据结构的数组与链表
    复杂度分析,数据结构的数组与链表参考书籍:Hello算法目录复杂度分析,数据结构的数组与链表复杂度分析时间复杂度空间复杂度数据结构数组与链表数组链表列表复杂度分析复杂度分析是用来判断一个算法效率的手段,执行时所需的时间和空间资源则是正好对应时间和空间复杂度。考虑到执......
  • C语言中实现一个包含开卡、查询内容、存钱、取钱、转账和修改密码的银行服务系统
       大家好,我是带我去滑雪,每天教你一个小技巧!   本次在C语言中实现一个包含开卡、查询内容、存钱、取钱、转账和修改密码的银行服务系统,下面开始代码实战。目录一、功能模块设计(1)开卡功能(2)查询内容(3)存钱功能(4)取钱功能(5)转账功能(6)修改密码功能二、数据结构......
  • 实验3 C语言函数应用编程
    1.实验任务1#include<stdio.h>charscore_to_grade(intscore);intmain(){intscore;chargrade;while(scanf("%d",&score)!=EOF){grade=score_to_grade(score);printf("分数:%d,等级:%c\n\n",score,grad......