`
kongweile
  • 浏览: 517515 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

链表反转的两种实现方法

 
阅读更多
#include <iostream>

using namespace std;

//元结点
struct Node
{
    int data;
    Node *next;
};

//链表反转(循环方法)
Node *Reverse(Node *head)
{
    Node *prev = NULL;
    Node *cur = NULL;
    Node *next = head;

    for (; next != NULL; )
    {
        cur = next;
        next = cur->next;
        cur->next = prev;
        prev = cur;
    }

    return prev;
}

//链表反转(递归方法)
Node *Reverse2(Node *head)
{
    if (!head)
    {
        return NULL;
    }

    Node *temp = Reverse2(head->next);

    if (!temp)
    {
        return head;
    }

    head->next->next = head;
    head->next = NULL;

    return temp;
}

//创建链表
Node *Construct(int *const array, int len)
{
    Node *pre = NULL, *head = NULL;

    for (int i = len; i > 0; i--)
    {
        if (!pre)
        {
            head = new Node;
            head->data = array[len - i];
            head->next = NULL;
            pre = head;
        }
        else
        {
            pre->next = new Node;
            pre = pre->next;
            pre->data = array[len - i];
            pre->next = NULL;
        }
    }

    return head;
}

//销毁链表
void Destruct(Node *head)
{
    Node *cur = head, *temp = NULL;

    while (cur)
    {
        temp = cur;
        cur = cur->next;
        delete temp;
    }
}

//打印链表
void Print(Node *head)
{
    Node *cur = head;

    for (; cur != NULL; cur = cur->next)
    {
        cout << "data: " << cur->data << endl;
    }
}

int main(int argc, char* argv[])
{
    Node *head = NULL;
    int array[] = {1, 3, 5, 7, 9, 10, 8, 6, 4, 2};

    cout << endl << "Construct!" << endl << endl;
    head = Construct(array, 10);
    Print(head);
    cout << endl << "Reverse!" << endl << endl;
    head = Reverse(head);
    Print(head);
    cout << endl << "Reverse2!" << endl << endl;
    head = Reverse2(head);
    Print(head);
    cout << endl << "Destruct!" << endl << endl;
    Destruct(head);
    head = NULL;
    Print(head);

    return 0;
}
 
分享到:
评论

相关推荐

    链表反转 C/C++

    本文将详细解析链表反转的原理以及C/C++语言下的实现方法。 ### 链表反转原理 链表由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在链表反转过程中,我们需调整每个节点的`next`指针,使其指向其前...

    java链表反转及排序

    在“java链表反转及排序”这个主题中,我们将探讨如何在Java中实现单向链表的反转和排序。首先,我们创建一个链表节点类,包含数据和指向下一个节点的引用: ```java public class ListNode { int val; // 节点值 ...

    JAVA双向链表反转实现

    以下是使用迭代方式实现双向链表反转的Java代码: ```java public void reverse() { if (head == null || head.next == null) { return; } Node current = head; Node previous = null; while (current != ...

    反转链表C实现

    通过上述分析,我们可以看到这个程序实现了基于C语言的链表反转功能。链表是一种非常基础且重要的数据结构,在计算机科学中有广泛的应用。理解并掌握链表的操作对于深入学习其他高级数据结构和技术有着重要意义。...

    基于Java实现的单链表基本操作之链表反转.zip

    这可以通过迭代或递归两种方式来实现。 1. **迭代法**:在迭代法中,我们通常使用三个指针,`prev`、`current`和`next`。初始时,`prev`为null,`current`为链表头。然后,我们循环遍历链表,每次迭代中,`next`...

    Java实现单向链表反转

    在main方法中,我们创建了一个单向链表A-&gt;B-&gt;C-&gt;D-&gt;E-&gt;F,然后使用LinkedListReversor.RECURSION和LinkedListReversor.NO_RECURSION两种策略来实现单向链表反转。最后,我们使用print方法来打印反转后的链表结果。 ...

    使用迭代和递归两种方法反转链表.docx

    本文将详细介绍如何使用迭代和递归两种方法来实现链表的反转。 #### 一、迭代方法 迭代方法通过改变节点的指针指向来实现链表的反转。这种方法不需要额外的空间,并且易于理解和实现。我们可以通过三个指针来完成...

    两种方法反转单链表

    本文将深入探讨两种方法来反转单链表,这些方法是基于Java编程语言实现的,因此相关知识点包括链表操作、递归以及迭代。 首先,我们需要了解单链表的基本结构。在Java中,一个简单的单链表节点可以定义为: ```...

    从尾到头打印链表(C语言实现)

    要实现从尾到头打印链表,一种方法是先将链表反转,然后逐个节点打印。链表的反转可以通过递归实现。以下是一个简单的链表反转函数的实现: ```c ListNode* reverseList(ListNode* head) { if (head == NULL || ...

    逆转单向链表(有7种方法)

    在本主题中,我们将探讨7种不同的方法来实现这个功能。 1. **迭代法**: 这是最直观的方法,使用三个指针`prev`, `current`和`next`。初始化时,`prev`为空,`current`为头节点。在每次迭代中,`next`保存`current...

    Python实现链表反转的方法分析【迭代法与递归法】

    链表反转是数据结构中常见的问题,特别是在Python编程中,有多种方法可以实现。本文主要讨论两种方法:迭代法和递归法。 首先,我们来看迭代法,也称为while循环实现。迭代法的核心思路是使用三个辅助变量:`cur_...

    反转带头结点的链表(4种方法)

    在C语言实现中,你需要创建对应的链表结构,然后调用上述函数之一进行链表反转。确保在测试代码时,先创建一个带头结点的链表,并打印反转后的链表以验证结果的正确性。同时,别忘了释放不再使用的内存,以避免内存...

    [面试/笔试系列5]链表反转

    #### 一、单向链表反转原理及实现 **1.1 基本概念** 单向链表是一种线性数据结构,每个元素包含两个部分:数据域和指向下一个元素的指针域。单向链表的特点是只能从前向后遍历。 **1.2 为什么要反转链表** 链表...

    实验二 链表基本操作的实现

    6. 反转链表:这是一项高级操作,需要重新分配每个节点的指针,使其指向其前一个节点,从而实现链表的反转。 7. 合并链表:两个有序链表的合并,可以实现高效的数据整合,通常从较小的链表开始,依次添加节点到较大...

    07丨链表(下):如何轻松写出正确的链表代码?1

    链表反转涉及到改变节点的指针方向,而有序链表合并则需要在保持顺序的同时合并两个已排序的链表。 【指针与引用】理解是编写链表代码的基础。指针是C语言中的概念,它存储了对象的内存地址,而引用在Java和Python...

    python算法题 链表反转详解

    实现链表反转有两种方式,一种是循环迭代,另外一种方式是递归。 第一种方式:循坏迭代 循坏迭代算法需要三个临时变量:pre、head、next,临界条件是链表为None或者链表就只有一个节点。 # encoding: utf-8 ...

    lianbiao.rar_反转链表

    迭代法是最常见的链表反转方法,通过三个指针previous、current和next来实现。初始化时,previous指针指向NULL,current指针指向链表头。然后,循环遍历链表,每次迭代都将current的下一个节点赋值给next,然后将...

    反转链表的一般用法和递归用法

    两种方法各有优缺点。迭代法思路直观,但需要额外的指针和循环,空间复杂度较低(O(1)),时间复杂度为O(n),其中n是链表的长度。递归法代码简洁,但递归深度可能达到n,可能导致栈溢出,空间复杂度为O(n)。在实际...

    链表倒序__实现单向链表倒序

    链表倒序的实现方法主要有两种:迭代法和递归法。 1. 迭代法: 迭代法是通过三个指针,prev、curr和next来实现链表的反转。初始时,prev指向None,curr指向链表头节点,next用于临时存储curr的下一个节点。在循环...

    链表c代码实现

    链表是一种重要的数据结构,它在计算机科学...在实际应用中,还可以添加更多的功能,如搜索元素、反转链表、合并两个链表等。对于C语言实现的链表,理解内存管理和指针操作至关重要,这直接影响到程序的正确性和效率。

Global site tag (gtag.js) - Google Analytics