首页 > 其他分享 >C中单链表反序的实现方法是什么?

C中单链表反序的实现方法是什么?

时间:2024-12-26 22:01:26浏览次数:7  
标签:Node head gt 反序 next -& 单链 方法 节点

C中单链表反序的实现方法

在C语言中,单链表的反序操作可以通过多种方法实现,主要包括迭代法和递归法。以下是详细的实现步骤和示例代码。

迭代法实现单链表反序

迭代法是通过遍历链表,将当前节点的指针指向前一个节点,从而实现链表的逆序。具体步骤如下:

  1. 「定义节点结构体」:定义一个包含数据和指向下一个节点指针的结构体。
  2. 「初始化指针」:初始化三个指针,分别指向当前节点、前一个节点和下一个节点。
  3. 「遍历链表」:遍历链表,将当前节点的指针指向前一个节点,然后移动指针,直到遍历完成。
  4. 「更新头节点」:将头节点指向最后一个节点,即逆序后的链表头节点。
示例代码
#include <stdio.h>

#include <stdlib.h>



// 定义链表节点结构体

typedef struct Node {

    int data;

    struct Node* next;

} Node;



// 创建新节点

Node* createNode(int data) {

    Node*newNode = (Node*)malloc(sizeof(Node));

    if (newNode == NULL) {

        printf("内存分配失败\n");

        return NULL;

    }

    newNode->data = data;

    newNode->next = NULL;

    return newNode;

}



// 打印链表

void printList(Node* head) {

    Node* current = head;

    while (current != NULL) {

        printf("%d -> ", current->data);

        current = current->next;

    }

    printf("NULL\n");

}



// 反转链表

Node*reverseList(Node* head) {

    Node* prev = NULL;

    Node* current = head;

    Node* next = NULL;

    

    while (current != NULL) {

        next = current->next;  // 保存下一个节点

        current->next = prev;  // 将当前节点的next指向前一个节点

        prev = current;        // 将prev移动到当前节点

        current = next;        // 将current移动到下一个节点

    }

    head = prev;  // 更新头节点为最后一个节点

    return head;

}



int main() {

    Node* head = NULL;

    head = createNode(1);

    head->next = createNode(2);

    head->next->next = createNode(3);

    head->next->next->next = createNode(4);

    head->next->next->next->next = createNode(5);



    printf("原始链表: ");

    printList(head);



    head = reverseList(head);



    printf("反转后的链表: ");

    printList(head);



    return 0;

}

递归法实现单链表反序

递归法是通过递归调用函数来实现链表的逆序。具体步骤如下:

  1. 「递归终止条件」:如果当前节点为空或只有一个节点,则直接返回当前节点。
  2. 「递归调用」:递归调用函数处理下一个节点。
  3. 「调整指针」:将当前节点的下一个节点的next指针指向当前节点,然后将当前节点的next指针置为NULL。
  4. 「返回头节点」:返回递归调用的结果,即逆序后的链表头节点。
示例代码
#include <stdio.h>

#include <stdlib.h>



// 定义链表节点结构体

typedef struct Node {

    int data;

    struct Node* next;

} Node;



// 创建新节点

Node* createNode(int data) {

    Node*newNode = (Node*)malloc(sizeof(Node));

    if (newNode == NULL) {

        printf("内存分配失败\n");

        return NULL;

    }

    newNode->data = data;

    newNode->next = NULL;

    return newNode;

}



// 打印链表

void printList(Node* head) {

    Node* current = head;

    while (current != NULL) {

        printf("%d -> ", current->data);

        current = current->next;

    }

    printf("NULL\n");

}



// 递归反转链表

Node*reverseListRecursive(Node* head) {

    if (head == NULL || head->next == NULL) {

        return head;

    }

    Node* newHead = reverseListRecursive(head->next);

    head->next->next = head;

    head->next = NULL;

    return newHead;

}



int main() {

    Node* head = NULL;

    head = createNode(1);

    head->next = createNode(2);

    head->next->next = createNode(3);

    head->next->next->next = createNode(4);

    head->next->next->next->next = createNode(5);



    printf("原始链表: ");

    printList(head);



    head = reverseListRecursive(head);



    printf("反转后的链表: ");

    printList(head);



    return 0;

}

总结

以上两种方法都可以有效地实现单链表的逆序操作。迭代法通过遍历链表并调整指针指向关系来实现逆序,而递归法则通过递归调用函数来处理每个节点的逆序操作。根据具体需求和场景选择合适的方法即可。

标签:Node,head,gt,反序,next,-&,单链,方法,节点
From: https://blog.csdn.net/wang15510689957/article/details/144627662

相关文章

  • 多种实现数组去重的方法:适用场景和特点
    ......
  • pandas常用方法
    删:df2.dropna()df2.dropna(subset=['消费','姓名'])数据填充:df.fillna(0)填充0df.fillna({'客单价':666,'支付金额':df['支付金额'].min()})df.drop_duplicates()//去重删除所有行df.drop_duplicates(subset='流量级别')//从下往上删df.dr......
  • 【数据结构与算法】线性表——顺序储存与单链表
    【数据结构与算法】线性表——顺序储存与单链表文章目录【数据结构与算法】线性表——顺序储存与单链表一、线性表的基本概念1.线性表的定义2.线性表的分类二、线性表的顺序存储1.顺序表的基本操作1.1插入操作1.2删除操作1.3查找操作三、线性表的链式存储1.单......
  • Extjs中Ext.Array 方法的使用
    1.Ext.Array.clean(arr);过滤数组中的空元素vararr=[1,"",2,"",3];Ext.clean(arr);//[1,2,3]2.Ext.Array.clone(arr);可以克隆数组,对象,dom节点和日期数据,以避免保持旧的指向vararr=[1,,2,3];Ext.clone(arr)3.Ext.Array.contains(arr,items);检查此数组是否包含......
  • 大模型微调方法(非常详细),收藏这一篇就够了!
    引言众所周知,大语言模型(LLM)正在飞速发展,各行业都有了自己的大模型。其中,大模型微调技术在此过程中起到了非常关键的作用,它提升了模型的生成效率和适应性,使其能够在多样化的应用场景中发挥更大的价值。前排提示,文末有大模型AGI-CSDN独家资料包哦!那么,今天这篇文章就带大......
  • error while loading shared libraries: libncurses.so.5: cannot open shared object
    第一个错误:errorwhileloadingsharedlibraries:libncurses.so.5:cannotopensharedobjectfile解决方法:该错误的原因是因为所依赖的libncurses.so版本问题,默认依赖的版本是libncurses.so.5,但是系统上libncurses.so的版本不是5导致的。可以在/usr/lib64文件夹下查找当......
  • Object中的方法
    静态方法Equals判断两个对象是否相等最终的判断全交给左侧对象的Equals方法不管是值类型还是引用类型都会按照左侧对象Equals方法的规则来进行比较ReferenceEquals比较两个对象是否是相同的引用,主要用来比较引用类型的对象值类型对象返回值始终是false成员方法GetType......
  • 防泄密通过哪几方面进行防范,数据防泄密的10个方法要知道!
    防泄密通过哪几方面进行防范,数据防泄密的10个方法要知道!数据泄密已成为企业面临的最严重威胁之一。为了有效保护敏感信息,企业需要采取多方面的防范措施。本文将结合“数据防泄密的10个方法”,重点介绍域智盾软件如何通过其强大的功能,帮助企业构建坚固的数据安全防线。数据......
  • Python基础--类方法、实例方法、静态方法
    一、什么是类和实例类(Class)是一个蓝图或模板,它定义了对象的行为和属性。例如,你可以把“汽车”作为一个类,它定义了所有汽车共有的属性(比如颜色、品牌)和行为(比如启动、刹车)。实例(Instance)是类的具体对象。每一个具体的对象都是一个类的实例,比如“我的红色宝马车”就是“汽车”类的......
  • 老旧电脑当私有云,老旧电脑搭建私有云的方法
        随着云存储技术的普及,越来越多的人希望利用云存储来保存和管理自己的数据,但订阅第三方云存储服务往往需要支付费用。如果您手头有一台旧电脑,与其将它闲置或丢弃,不如将它改造成私人云存储服务器!这样不仅可以充分利用现有资源,还能确保数据的私密性和可控性。那么,如何使用......