翻转链表算法和实现

简介: 1 翻转思路1-1 整体的思路1-2 详细的思路2 代码实现3 运行结果写个翻转链表算法,刚开始想到一个不错的思路。这个思路运行效率不低,时间复杂度为O(n);可以不用分配额外的节点空间,空间复杂度为O(0)。

写个翻转链表算法,刚开始想到一个不错的思路。这个思路运行效率不低,时间复杂度为O(n);可以不用分配额外的节点空间,空间复杂度为O(0)。现在把思路整理一下,并实现代码,测试运行结果。

1、 翻转思路

1-1 整体的思路

用一个while顺序遍历这个链表,然后把遍历到每个节点插入到链表头部。

这里写图片描述

1-2 详细的思路

蓝色箭头即赋值符号,比如在第2个结点的操作:

  • step 2.1:front指针前移一位;
  • step 2.2:把head节点的next值(即指向节点1的地址)赋给节点2;
  • step 2.3:把节点2的地址赋给head节点的next;
  • step 2.4:back指针前移一位;

while遍历条件可根据back不为空,即while(back)

这里写图片描述

2、 代码实现

#include<stdio.h>       // NULL
#include<stdlib.h>      // malloc
#define ElemType int

typedef struct LNode{   // 定义单链表结点类型
    ElemType data;      // 数据域
    struct LNode *next; // 指针域
}LNode, *LinkList;      // LinkList相当于LNode*,即:struct LNode*

// 尾插法建立单链表L
LinkList listcreat_fromtail(LinkList L);
// 翻转链表L的算法
LinkList reverse_linklist(LinkList L);
// 把节点Node插入链表L头部
LinkList insert_head(LinkList L, LNode * Node);
// 输出链表L元素, flag=0为链表翻转前,flag=1为链表翻转后
void print_linklist(LinkList L, int flag);

int main(int argc, char *argv[])
{
    LinkList L;

    // 尾插法建立单链表L
    L = listcreat_fromtail(L);

    // 输出翻转前(flag=0)链表元素
    print_linklist(L, 0);

    // 翻转链表L
    L = reverse_linklist(L);

    // 输出翻转后(flag=1)链表元素
    print_linklist(L, 1);

    return 0;
}

// 翻转链表L的算法
LinkList reverse_linklist(LinkList L)
{
    LNode *back, *front;

    back = L->next; // step 0.1, init 
    L->next = NULL; // step 0.2, init

    while(back){
        front = back->next;      // step x.1
        L = insert_head(L, back);// step x.2, step x.3
        back = front;            // step x.4
    }
    //back = front = NULL;         // for secure

    return L;
}

// 把节点Node插入链表L头部
LinkList insert_head(LinkList L, LNode * node)
{
    node->next = L->next; // step x.2
    L->next = node;       // step x.3

    return L;
}

// 输出链表L元素, flag=0为链表翻转前,flag=1为链表翻转后
void print_linklist(LinkList L, int flag)
{
    printf(flag ? "翻转后:\n" : "翻转前:\n");

    printf("单链表元素个数:%d, 分别是:", L->data);
    for(LNode* N = L->next; N; N = N->next){
        printf("%d ",N->data);
    }

    puts("\n");
}

//尾插法建立单链表L
LinkList listcreat_fromtail(LinkList L)
{
    int len, data;
    LNode *r;

    L = (LinkList)malloc(sizeof(LNode));
    L->data = 0; L->next = NULL; // L->data为链表长度
    r = L;                       // r为表尾指针

    printf("请输入插法建立单链表长度:");
    scanf("%d", &len);
    printf("请逐个输入链表元素:");
    while(len--){
        scanf("%d",&data);
        LNode *s=(LNode*)malloc(sizeof(LNode));
        s->data = data; s->next = NULL;
        r->next = s;
        r = r->next;
        L->data++;    // 链表长度+1
    }
    return L;
}

3、 运行结果

huashidazhongbeitushuguandeiMac-2:Wu_Being duzhe$ vim reverse_linklist.c
huashidazhongbeitushuguandeiMac-2:Wu_Being duzhe$ gcc reverse_linklist.c 
huashidazhongbeitushuguandeiMac-2:Wu_Being duzhe$ ./a.out 
请输入插法建立单链表长度:5
请逐个输入链表元素:1 2 3 4 5
翻转前:
单链表元素个数:5, 分别是:1 2 3 4 5 

翻转后:
单链表元素个数:5, 分别是:5 4 3 2 1 

huashidazhongbeitushuguandeiMac-2:Wu_Being duzhe$ ./a.out 
请输入插法建立单链表长度:3
请逐个输入链表元素:1 2 3 4
翻转前:
单链表元素个数:3, 分别是:1 2 3 

翻转后:
单链表元素个数:3, 分别是:3 2 1 

huashidazhongbeitushuguandeiMac-2:Wu_Being duzhe$ 

Wu_Being博客声明:本人博客欢迎转载,请标明博客原文和原链接!谢谢!
《翻转链表算法和实现》:
http://blog.csdn.net/u014134180/article/details/78423589

Wu_Being 吴兵博客接受赞助费二维码

如果你看完这篇博文,觉得对你有帮助,并且愿意付赞助费,那么我会更有动力写下去。

目录
相关文章
|
3月前
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
73 0
|
9月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
141 1
|
4月前
|
存储 监控 算法
员工电脑监控系统中的 C# 链表算法剖析-如何监控员工的电脑
当代企业管理体系中,员工电脑监控已成为一个具有重要研究价值与实践意义的关键议题。随着数字化办公模式的广泛普及,企业亟需确保员工对公司资源的合理利用,维护网络安全环境,并提升整体工作效率。有效的电脑监控手段对于企业实现这些目标具有不可忽视的作用,而这一过程离不开精妙的数据结构与算法作为技术支撑。本文旨在深入探究链表(Linked List)这一经典数据结构在员工电脑监控场景中的具体应用,并通过 C# 编程语言给出详尽的代码实现与解析。
77 5
|
5月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
142 29
|
5月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
199 25
|
9月前
|
算法 索引
❤️算法笔记❤️-(每日一刷-141、环形链表)
❤️算法笔记❤️-(每日一刷-141、环形链表)
104 0
|
9月前
|
算法
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
100 0
|
9月前
|
算法
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
81 0
|
9月前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
241 0
|
5月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
75 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨

热门文章

最新文章