首页 > 其他分享 >[数据结构]单向链表的翻转(C语言)

[数据结构]单向链表的翻转(C语言)

时间:2022-12-27 21:00:55浏览次数:46  
标签:Linklist head C语言 next 链表 数据结构 节点 cur

单向链表的翻转

单向链表翻转 思路

假设链表是: 1->3->5->∅,所要求得的链表是 5->3->1->∅。只需要将每个节点的 next 指向其之前的一个节点即可。
对于第一个节点,如果是头节点不带数据的链表,那么只需要将其 next 指向 head;如果头节点带数据,第一个节点的 next 指向NULL。在进行操作过程中,我们用 pre 标记之前的节点, cur 标记当前的节点,当 cur 指向的节点的 next 指向前一个,那么就发了改变,所以同时我们还需要保存每个节点 curnext 指向的节点,由此来往后进行操作。直到最后所有节点翻转结束,此时的 pre 指针指向了当前完成翻转后链表的头,如果是有无数据头节点的链表,将其 headnext 指向当前的 pre 即可。



单向链表翻转 图解

cur指向第一个带数据节点,nex保存下一节点

cur的next指向前一个节点

此时头节点head应当指向第一个节点, 但是为了图解美观可以暂时不管它,后面也是这样

pre指向当前的cur, cur指向下一个节点

重复之前翻转的操作

此时cur指向了NULL, 退出循环

最后head接回, 其next指向当前pre指向的节点



单向链表翻转 核心代码

void Reverse_Linklist(Linklist *head){
    Linklist *cur = head->next;
    Linklist *pre = NULL;
    while(cur){
	Linklist *nex = cur->next;
	cur->next = pre;
	pre = cur;
	cur = nex;
    }
    head->next = pre;
}


完整程序及测试

程序代码

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

typedef int Elemtype;
typedef struct Node {

    Elemtype data;           //结构体数据域
    struct Node *next;       //结构体指针域

} Linklist;


Linklist* Initial_linklist(Linklist *mylist){
    mylist = (Linklist *)malloc(sizeof(Linklist));
    mylist->next = NULL;
    return mylist;
}

//创建初始链表  尾插法
void Create_linklist(Linklist *head, int n) {    //头节点(不带数据)
    Linklist *node, *end;                        //普通节点 尾节点
    end = head;                                  //当链表为空时 头尾指向同一个节点
    printf("创建链表输入 %d 个元素:\n", n);
    for (int i = 0; i < n; i++) {                //n为插入普通节点的个数
	node = (Linklist *)malloc(sizeof(Linklist));
	scanf("%d", &node->data);
	end->next = node;                        //之前的end的next指向了新的节点node
	end = node;                              //end往后移,此时新的节点变成尾节点
    }
    end->next = NULL;                            //end最后置NULL
}

//遍历输出链表
void Show_linklist(Linklist *head) {
    Linklist *node = head->next;
    if (node == NULL)
	puts("链表为空");

    while (node != NULL) {
        printf("%d ", node->data);
	node = node->next;
    }
    printf("\n\n");
}

//翻转链表
void Reverse_Linklist(Linklist *head){
    Linklist *cur = head->next;
    Linklist *pre = NULL;
    while(cur){
	Linklist *nex = cur->next;
	cur->next = pre;
	pre = cur;
	cur = nex;
    }
    head->next = pre;
}


int main() {
    //头指针初始化
    Linklist *mylist;
    mylist = Initial_linklist(mylist);

    int n;
    printf("输入创建初始链表元素个数: ");
    scanf("%d", &n);

    Create_linklist(mylist, n);
    printf("初始状态链表:\n");
    Show_linklist(mylist);

    Reverse_Linklist(mylist);
    printf("链表进行翻转后:\n");
    Show_linklist(mylist);
}

运行结果

标签:Linklist,head,C语言,next,链表,数据结构,节点,cur
From: https://www.cnblogs.com/MAKISE004/p/17008983.html

相关文章

  • 郝斌老师数据结构课程笔记
    说明1.建议用notepad++、或UE打开,文件以.c的形式提供,就是是为了高亮显示,才会有论坛图片上的效果,如果用记事本观看会有点乱,如果记事本采用自动换行会更乱。2.本人没什么技术,......
  • 【C语言】memcpy() 内存拷贝不重叠
    前言本篇博客就来介绍下关于C语言常用的内存函数之memcpy()函数。 ......
  • 【C语言】calloc()、realloc()
    ......
  • 《C语言程序设计》课程设计实践考核说明
    《C语言程序设计》课程设计实践考核说明《C语言程序设计》课程设计实践考核说明本次设计是为加强学生的《C语言程序设计》课程的实际应用能力而进行的专门训练。选题考虑......
  • 6个变态的C语言Hello World程序 之 雷人的程序语言
    下面的六个程序片段主要完成这些事情:输出Hello,World混乱C语言的源代码下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C++的编译器g++才能编程通过。hello1.......
  • C语言中使用数学函数
    C语言中使用数学函数,例如:exp等1、包含头文件#include<math.h>2、编辑源码testExp.c,例如:#include<stdio.h>#include<math.h>intmain(){doublem=4......
  • C语言备忘知识点
    1.输入输出格式scanf当中若是对双精度的变量赋值是必须是%后跟lf,而printf当中可以用%f也可以用%lf没有限制。printf("%-20.3d",a);//左对齐,宽度为20,保......
  • c: c语言——结构和指针
     c语言——结构和指针    一、基础说明:成员运算符(.)和指针运算符(->) 0、变量的数据类型的说明:指针类型和非指针类型0.1、指针类型的变量:指针类型,......
  • BM4-合并两个有序链表
    题目要求思路分析对于链表类的题,其实大部分有一个万能的方法,就是遍历一次链表,将他们的节点放到数组中,将节点的next置空,使用数组的各种方法去操作链表,之后再拼接链表。不......
  • C语言开发环境搭建:VSCode+GCC
    文章目录​​一.VSCode介绍​​​​二.GCC编译器​​​​1.安装​​​​三.VScode中配置GCC​​一.VSCode介绍VSCode(全称:VisualStudioCode)是一款由微软开发且跨平台......