数据结构——线性表——链表反转

链表反转有两种常见方式。下面从图中详细解释。其中带有部分核心代码,最后上完整代码。

迭代法

//首先定义三个变量
    PNODE pre = NULL;
    PNODE now = pHead->pNext;
    PNODE next = NULL;

next = now->pNext;//先保存下一个节点

now->pNext = pre;//当前节点的next指针指向前一个节点

pre = now;//前一个节点赋值为当前节点

now = next;//当前节点赋值为下一个节点

递归法

//一直递归直到找到尾节点
    if(pHead == NULL || pHead->pNext == NULL)
        return pHead;

pHead->pNext->pNext = pHead;//让当前节点的下一个节点的指针指向当前节点

pHead->pNext = NULL;//让当前节点的下一个节点指向NULL

再来一步

全部代码

/**
*反转链表
**/ 

#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std;

typedef struct Node{
    int data;//数据域
    struct Node* pNext;//指针域
}NODE, *PNODE;//NODE等价于struct Node,PNODE等价于struct Node* 

//打印链表所有元素
void print_list(PNODE pHead)
{
    pHead = pHead->pNext;
    while(pHead != NULL)
    {
        cout<<pHead->data<<" ";
        pHead = pHead->pNext;
    }
    cout<<endl;
    return;
}

//创建链表
PNODE create_list()
{
    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    PNODE pNow = pHead;

    for(int i=1; i<=5; i++)
    {
        PNODE pNew = (PNODE)malloc(sizeof(NODE));
        pNew->data = i;
        pNow->pNext = pNew;
        pNow = pNew;
    }
    pNow->pNext = NULL;
    return pHead;
}

//迭代反转链表
void reverse_list(PNODE pHead)
{
    //首先定义三个变量
    PNODE pre = NULL;
    PNODE now = pHead->pNext;
    PNODE next = NULL;

    //反转
    while(now != NULL)
    {
        next = now->pNext;//先保存下一个节点
        now->pNext = pre;//当前节点的next指针指向前一个节点
        pre = now;//前一个节点赋值为当前节点
        now = next;//当前节点赋值为下一个节点
    }

    //最后把头结点指向新生成链表的头
    pHead->pNext = pre;
    return;
}

//递归反转链表
PNODE reverse_list2(PNODE pHead)
{
    //一直递归直到找到尾节点
    if(pHead == NULL || pHead->pNext == NULL)
        return pHead;

    PNODE pNew = reverse_list2(pHead->pNext);//返回的永远都是尾节点
    pHead->pNext->pNext = pHead;//让当前节点的下一个节点的指针指向当前节点
    pHead->pNext = NULL;//让当前节点的下一个节点指向NULL 

    //返回的是原来链表的尾节点,也就是新链表的首节点
    return pNew;
}

int main()
{
    PNODE pHead = NULL;
    pHead = create_list();
    print_list(pHead);

    cout<<"迭代反转链表之后"<<endl;
    reverse_list(pHead);
    print_list(pHead);

    cout<<"递归反转链表之后"<<endl;
    pHead->pNext = reverse_list2(pHead->pNext);
    print_list(pHead);
    return 0;
}
时间: 2024-08-01 22:42:55

数据结构——线性表——链表反转的相关文章

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

数据结构&gt;&gt;线性表【注意】--&gt;链表求A-B(原A与B都递增,求完的A-B不改变A原来的顺序)

/*关于链表的题目 * A.B是两个递增有序的单链表,元素个数分别是m和n,求 * 集合A-B,并将结果保存在A中,且仍然保持递增有序. * converge_ab */ #include <iostream.h> using namespace std; typedef struct lnode{ int data; struct lnode * next; }lnode; int main(){ lnode * create_chain(int num,int interval,int s

[考研系列之数据结构]线性表之链表

1.链表分类 通过线性表概述,我们知道了链表这样一种数据结构,它又分成三类,分别是 单向链表 循环链表 双向链表 单向链表 单向链表的指针域只有一个指向下一个节点的指针,需要注意几点: 1.头指针--指向第一个节点 2.最后一个结点的指针指向NULL 3.头结点--在链表的第一个结点之前附设一个结点,它的数据域为空 所以,我们看到:  单向链表为空的<=>链表有且只有一个头结点<=>头结点的指针指向NULL 循环链表 循环链表和单向链表最大的不同就是:最后一个结点的指针不再指向NU

《数据结构 - 线性表》链式存储 (单链表)

一:线性表定义 -<数据结构 - 线性表>顺序存储结构 二:为什么要 链式存储 线性表? - 因为在使用 顺序结构 存储方式存储的时候,每次进行 插入/删除 都需要大量移动元素的位置. - 所以设计出一种 存储空间不连续 的存储结构. - 这个线性表可能是这样的(存储位置不固定) -  三:链式存储 定义 -  因为链式存储,不是连续空间,所以需要两个信息 - 一个用于 存储数据元素,也叫做 数据域 - 一个用于 指向 下一个位置 的 指示信息,叫做指针域. - 指针域中存储的信息叫指针/链

数据结构-线性表(2)

线性表定义: 线性表是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表的逻辑结构简单,便于实现和操作.因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构. 存储空间是否连续: 一.顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 优点: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑关系而增加额外的存储开

java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能

package 顺序表; import java.util.ArrayList; import java.util.Scanner; public class OrderList { /** * @param args * @author 刘雁冰 * @2015-1-31 21:00 */ /* * (以下所谓"位置"不是从0开始的数组下标表示法,而是从1开始的表示法.) * (如12,13,14,15,16数据中,位置2上的数据即是13) * * 利用JAVA实现数据结构-线性表-顺

[考研系列之数据结构]线性表概述

1.脑图 2.表示方法 按照数据结构概述所说,线性表有两种表示方法分别是顺序表示和链式表示,链表就是链式表示的典型. 我们知道链式表示是分配了n块内存空间,可以认为彼此不连续,所以不能用偏移量去定位每个元素. 下面就先说最简单的单向链表: 如果每个数据元素能有一个指针指向下一个元素的话,那么只需要知道第一个数据元素就能一个一个的遍历整个链表了,这就是单向链表. 对于每个链表元素我们称之为节点,每个节点都有两个域:数据域&指针域 数据域就是数据元素所在的区域,而指针域则是存储指向另一个节点的指针的

数据结构——线性表(第二章)

一.基本概念 1.线性表:简称表,是n(n>=0)个具有相同类型的数据元素的有限序列,线性表中数据元素的个数称为线性表的长度.长度为零时称为空表. 2.线性表的顺序存储结构称为顺序表. 3.单链表:单链表是一组任意的存储单元存放线性表的位置,这组存储单元可以连续也可以不连续,甚至可以零散分布在内存中的任意位置. 下面着重介绍有关单链表的操作: #include<iostream> using namespace std; const int maxsize = 10; // 定义单链表的

数据结构—线性表

存放学生表的链表的结点类型: typedef struct studentnod{ int no; char name[8]; char sex[2]; char class[4]; struct studentnod *next;}stuType; 线性表:是具有相同特性的数据元素的一个有限序列: 线性表的顺序存储结构:顺序表 顺序表的存储类型: typedef struct { ElemType data[Maxsize]; int length; }Sqlist; 顺序表的元素查找: in