当前位置: 首页 > news >正文

单链表逆转

单链表逆转

 

单链表逆转算法草图如下:

 

方法1:借助辅助空间

建立临时的新链表,将新节点指向其前驱结点实现逆转:

复制代码
#include <stdio.h>
#include <conio.h>
#include<malloc.h>
//#include "alloc.h"

typedef struct  /* 使用typedef定义类型 */
{
    char x;
    struct node * next;
} node;

node * input()
{
    node *p1,*p2,*h=NULL;
    char ch;
    while(1)
    {
        ch=getche();
        if(ch=='\r') break;
        p1=(node *)malloc(sizeof(node));
        p1->x=ch;
        if(h==NULL) h=p1;
        else p2->next=p1;
        p2=p1;
    }
    p1->next=NULL;
    return h;
}

void display(node *p)
{
    printf("\n");
    while(p!=NULL)
    {
        putchar(p->x);
        p=p->next;
    }
}

node * reverse(node * p)
{
    node * p1=NULL,*p2;
    while(p!=NULL)
    {
        p2=(node *) malloc(sizeof(node));
        if(p1==NULL) p2->next=NULL; /* 逆转之后,原链表的头结点就是新链表的尾结点 */
        else p2->next=p1;    /* 如果不是第一个结点,则本次产生的新结点是上次结点的前一个 */
        p1=p2;
        p2->x=p->x;
        p=p->next;
    }
    return p1;  /*原链表的最后一个结点是新链表的头结点 */
}

int main(void)
{
    node * head,* h2;
    head=input();
    display(head);
    h2=reverse(head);
    display(h2);
    getch();

    return 0;
}
复制代码

 

方法2:原地逆转

头尾互换,指针指向反转

复制代码
#include <stdio.h>
#include <conio.h>
#include <malloc.h>

struct node
{   char x;
    struct node * next;
};

struct node * input()
{
    struct node *p1,*p2,*h=NULL;
    char ch;
    while(1)
    {
        ch=getche();
        if(ch=='\r') break;
        p1=(struct node *)malloc(sizeof(struct node));
        p1->x=ch;
        if(h==NULL) h=p1;
        else p2->next=p1;
        p2=p1;
    }
    
    p1->next=NULL;
    return h;
}

void display(struct node *p)
{
    printf("\n");
    while(p!=NULL)
    {
        putchar(p->x);
        p=p->next;
    }
}

struct node * reverse(struct node *h)
{
  struct node *p=h,*q=NULL,*listend=h;
  while(listend->next!=NULL) listend=listend->next;
  
  while(p!=listend)
  {
    h=p->next;
    listend->next=p;
    if(q==NULL) p->next=NULL;
    else p->next=q;
    q=p;
    p=h;
  }
  
  return h;
}

int main(void)
{
  struct node * head;
  head=input();
  head=reverse(head);
  display(head);
  getch();
  
  return 0;
}
复制代码

 

List_ptr InvertList(List_ptr  head) //原地逆转单链表head
{
  List_ptr p=head,q=NULL,listend=head;
  while(listend->next!=NULL) listend=listend->next;
   
  while(p!=listend)
  {
    head=p->next;
    listend->next=p;
    if(q==NULL) p->next=NULL;
    else p->next=q;
    q=p;
    p=head;
  }
   
  return head;
}

 

思考:

单链表的逆转如上都是采用循环遍历的方法,那应该也可采用递归遍历的方法吧?  

转载于:https://www.cnblogs.com/Ph-one/p/6473016.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SMTP协议原始命令码和工作原理
  • Maven编译代码的相关命令
  • java实用正则表达式工具类
  • cmd命令使用笔记
  • 常见的remoteobject错误
  • 剑指offer编程题Java实现——面试题10二进制中1的个数
  • java判断全角半角
  • java全角半角间的转换
  • PAT 1065. 单身狗(25)
  • Project '' is missing required Java project: ''
  • 没项目和要发项目请来,全套flex网站,软件项目交易网站-天人项目网
  • 初识Struts2
  • 重读《从菜鸟到测试架构师》-- 大促带来的灾难
  • MyEclipse/Eclipse的内存优化与内存不足的解决办法
  • FLEX RSL(让你的swf瘦身)
  • css选择器
  • golang 发送GET和POST示例
  • Laravel Mix运行时关于es2015报错解决方案
  • node-glob通配符
  • Redis字符串类型内部编码剖析
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Vue2 SSR 的优化之旅
  • 记录:CentOS7.2配置LNMP环境记录
  • 如何编写一个可升级的智能合约
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 项目实战-Api的解决方案
  • Spring Batch JSON 支持
  • ​iOS实时查看App运行日志
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • # Redis 入门到精通(七)-- redis 删除策略
  • # 数仓建模:如何构建主题宽表模型?
  • # 职场生活之道:善于团结
  • #define、const、typedef的差别
  • $.ajax()
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (备份) esp32 GPIO
  • (二)换源+apt-get基础配置+搜狗拼音
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (排序详解之 堆排序)
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)LINQ之路
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .ai域名是什么后缀?
  • .bat批处理出现中文乱码的情况
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .net 流——流的类型体系简单介绍
  • .net 设置默认首页
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .net打印*三角形