单链表的倒序

单链表、单链表反转、单链表的倒叙打印 单链表 链表每个节点包含data域,next域:指向下一个节点 创建HeroNode类,其中包含HeroNode next; 创建LinkedList类,先创建一个头节点 遍历思路: 通过一个辅助变量来遍历 一般来说,展示链表中所有数据要先判断链表是否为空。 添加内容思路: 直接添加到尾部:直接加到最后面(遍历找到最后面,再添加) 按顺序添加:找到要添加的位置,新节点.next = temp.next,temp.next = 新节点。 修改节点的思路: 先找到这个节点(遍历) 修改数值 阅读详情

原文:https://blog.youkuaiyun.com/evan123mg/article/details/45725357

 

单链表的翻转是一道很基本的算法题。

        方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。

        方法2:使用三个指针遍历单链表,逐个链接点进行反转。

        方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。

        方法1的问题是浪费空间。方法2和方法3效率相当。一般方法2较为常用。

方法2代码:

[cpp] view plaincopy

  1. Node * ReverseList(Node *head)  
  2. {  
  3.     Node *p1,*p2,*p3;  
  4.     if(head==NULL||*head==NULL)  
  5.     return head;  
  6.     p1=head;  
  7.     p2=p1->next;  
  8.     while(p2)             //注意条件  
  9.     {  
  10.         p3=p2->next;       //要改变p2->next的指针,所以必须先保留p2->next           
  11.         p2->next=p1;  
  12.         p1=p2;            //循环往后  
  13.         p2=p3;  
  14.     }  
  15.     head->next=NULL;   //原先的head已经变成tail,别忘了置空,只有到这步才能置空  
  16.     *head=p1;  
  17.     return head;  
  18. }  


方法3代码:

[cpp] view plaincopy

  1. Node* ReverseList(Node* head)   
  2. {   
  3.     Node *p,*q;    
  4.     p=head->next;   
  5.     while(p->next!=NULL)      //在这个循环过程中p所指的元素一直是不变的  
  6.     {  
  7.         q=p->next;   
  8.         p->next=q->next;   
  9.         q->next=head->next;   
  10.         head->next=q;   
  11.     }   
  12.     p->next=head;            //相当于成环   
  13.     head=p->next->next;       //新head变为原head的next   
  14.     p->next->next=NULL;     //断掉环   
  15.     return head;     
  16. }  


 

       附加一道题目,《编程之美》的3.4:从无头链表中删除节点。假设有一个没有头指针的单链表。一个指针指向此链表中间的一个节点(不是第一个,也不是最后一个节点),请将该节点从单链表中删除。

       分析:无法知道前续的节点,只能知晓后续节点,所以存在一个难点,如何将前后两段连接起来。由于链表是要删除操作,所以多处一个可用空间。所以可以用翻转操作方法1的思想来解决。将需要删除节点的节点复制为其后续节点就可以了,这样后续节点已经不再链表中,可以进行析构。

 

 

 

public ListNode reverseList(ListNode head) {

        ListNode first = head;

        ListNode reverseHead = null; //建立一个新的节点用来存放结果

        while (first != null) { //遍历输入链表,开始处理每一个节点

            ListNode second = first.next; //先处理第一个节点first,所以需要一个指针来存储first的后继

            first.next = reverseHead; //将first放到新链表头节点的头部

            reverseHead = first; //移动新链表的头指针,让它始终指向新链表头部

            first = second; //继续处理原链表的节点,即之前指针存放的后继,循环往复

        }

        return reverseHead;

【数据结构】单链表逆序 单链表的逆序问题,附图解析 阅读详情

相关推荐

倒序输出单链表的内容

单链表是最简单的数据结构,同时也是最常接触的数据结构,这个问题也很常见,通常这个问题我们有两种解决办法。      1.逆置单链表之后输出      这篇文章讲述了这样的过程http://blog.csdn.net/dlutbrucezhang/article/details/11709633,但是这种方法不一定可行,因为这样改变了单链表原来的结构      2.利用栈的后进先出的思想,首先我们正

张勤一 3208

单链表倒序

单链表倒序 题目来源 牛客网 题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 public class ListNode { int val; ListNode next = null; public ListNode(int val) { this.val = val; } public void setNext(ListNode node) { this.next = node; } }

csdn_wangchen的博客 526

Keil-C51 与 Keil -ARM 共存的方法

本篇为《嵌入式相关》系列博客的第五篇,该系列博客主要记录单片机开发及硬件设计的相关过程,方便以后查阅。 Keil-C51 与 Keil -ARM 共存的方法状况解决方案1测试解决方案2 状况 今天装完Keil-C51,然后又换装了Keil-ARM之后,可以正常编译STM32 的工程,但是无法编译C51的工程,并且出现了如下错误: *** Error: Project ‘template’ requires ‘C51’ Toolchain which is not installe 这种情况就是Keil-

梁小憨憨的博客 1万+

单链表之链表的倒序

单链表的倒序  借助结点法 今天我们要讲的如何将链表进行倒序的操作,链表的倒序操作我们讲比较普通的一种,那就是借助另一条链表或者另一个头节点来进行倒序的操作。    首先我们如图其中LA是我们的一条有数据的链表,L是一条只有一个头节点的链表,在这里我们的算法思想是将LA上的结点一个个取下来,然后一个个插入到L这条新的链表上。在插入的时候我们有几点要特别注意的就是怎样取...

l769440473的博客 3562

Matlab R2024a硬件支持包安装避坑指南:以Arduino为例(附离线包下载)

本文详细介绍了Matlab R2024a硬件支持包(Support Package)的安装流程,特别是针对Arduino平台的避坑指南和高效部署方法。从环境准备、离线安装方案到Arduino支持包的专项优化,提供了全面的技术细节和解决方案,帮助开发者避免常见错误,实现快速部署。

weixin_33737134的博客 446

Java 开发 修改【冒险岛 079 私服】完整学习流程

第 1-2 天:环境搭建 + 运行原版 079 服务端,能正常登录游戏;第 3-4 天:纯配置文件修改,掌握倍率、属性、怪物、道具的修改,改出第一个「百倍经验私服」;第 5-10 天:Java 代码基础修改,掌握 Player/Skill/Monster 核心类的修改,实现技能无冷却、一刀秒怪、升级满属性;第 11-20 天:Java 代码进阶修改,掌握业务逻辑修改,实现死亡不掉经验、自动捡物、装备强化无失败;第 21-30 天。

萧曳丶 3883

倒序单链表

 倒序单链表作者:异域の蜗牛 联系方式:425131593@qq.com 近来一些公司笔试时有这题,随手写一下算法:A.      首先保存1的next(即链表前进一个位置到2),然后1的next指向空作为倒序后的最后一个,从此时此刻1起,1相邻右边成员的next指向的地址与前一个(左边一个)成员的地址交换.交换后1的地址被3替换(即1到3的位置),变成3,2的next指向

异域の蜗牛's blog 2132

【雷达信号处理实战】从原理到代码:脉冲多普勒(PD)处理全流程解析与MATLAB仿真

本文深入解析了脉冲多普勒(PD)雷达信号处理的核心原理与全流程。通过剖析多普勒效应、脉冲压缩与慢时间FFT等关键技术,并结合详细的MATLAB仿真代码,手把手指导如何从信号建模、回波模拟到最终生成距离-多普勒谱,实现运动目标的精确测距与测速,直观展示了相参积累带来的显著性能增益。

pca5navigator的博客 950

单链表倒序遍历

上图要求倒序打印单链表。 思路: 方法一:先将单链表进行反转操作,然后再遍历即可,这样做的问题是会破话原来的单链表的结构,不建议。 方法二:可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点,就实现了逆序打印的效果。 //使用栈逆序打印单链表 public static void reversePrint(HeroNode head){ if(head.next == null){ return;//空链表 } .

weixin_45607513的博客 738

360加固DEX解密与ELF修复技术解析

本文深入解析360加固的DEX解密与ELF修复技术,详细介绍了其多层保护机制、Java层入口分析、Native层加载流程及反调试绕过技巧。通过RC4和zlib解密技术,结合Frida工具实现内存Dump和ELF文件修复,为逆向工程师提供实用解决方案。

weixin_29327525的博客 506

模块学习(一)——编码电机

编码电机测速

qq_51406846的博客 7911

倒序打印单链表

//倒序打印单链表 void rprint(List L){ Node* p = L->next; List L1 = (Node*)malloc(sizeof(Node));// Node* s = (Node*)malloc(sizeof(Node)); s->data = p->data; L1->next = s; Node* q = s;//q始终指向L1的第一个结点(非头结点),L1永远指向头结点 s->nex

weixin_45716046的博客 136

电磁场仿真软件:CST Studio Suite_(25).案例分析与实践

在电磁场仿真中,材料属性的设置至关重要。通过API,您可以轻松地设置和修改材料属性,以适应不同的仿真需求。通过以上案例分析和实践,您已经学会了如何在CST Studio Suite中进行二次开发。自动化仿真流程:批量创建和运行仿真项目、优化设计参数、生成报告。自定义仿真设置:设置材料属性、边界条件和激励源。数据处理与分析:读取仿真结果、数据可视化和数据导出。高级脚本开发:多线程仿真、集成机器学习和云仿真。这些技能将帮助您更高效地进行电磁场仿真,提高设计质量和工作效率。

kkchenjj的博客 1383

C语言笔试-单链表倒序

(1)方法一(循环算法) LINK_NODE *ReverseLink(LINK_NODE *head) { LINK_NODE *next; LINK_NODE *prev = NULL; while(head != NULL) { next = head->next; head->next = prev; ...

薛定谔的猫cc的博客 419

Android oom_adj 更新原理(一)

通过之前的两篇博文《lmkd 机制详解》和《lmkd中adj score的算法剖析》中,根据计算出来的 min_score_adj 选择大于该值的 oom_adj 的进程进行 kill 处理。oom_adj 随着应用状态的不同其值也是伴随着变化的。本文将通过源码剖析 oom_adj 更新的原理。

私房菜 2652

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

单链表倒序输出Java版

使用头插法实现带头结点的单链表倒序输出 HeroNode是节点类。 最重要的是要用一个节点next来存放当前节点的下一个节点的数据,不然链表会断开 /** * * @param head 原节点的头 */ public void returnHeroNode(HeroNode head){ //判断原链表是否为空 if (head.next == null || head.next.next == null){ ..

ALi的博客 656

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

单链表倒序的递归与非递归实现

单链表倒序的递归与非递归实现 在各大公司面试中,通常会遇到的最基本的算法题之一是单链表的倒序问题。在此仅介绍最常用的且复杂度相对较低的方法。 leetcode中同样也有这道题:Reverse a singly linked list 答案:http://www.programcreek.com/2014/05/leetcode-revers...

weixin_30672019的博客 239

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

初始化单链表,并在只遍历一次的情况下倒序

/*初始化单链表,并在只遍历一次的情况下倒序*/ #include<stdio.h>#include<stdlib.h>typedef struct Node{int data;struct Node *next;}node;struct Node * nodeinit(void) //构建单链表{node *h...

weixin_33873846的博客 133

利用递归正序、倒序输出没有头结点的单链表

这段代码正好能够体现递归语句在一般语句之前与之后是如何体现递归分解与求值的顺序的。#总结:在递归语句之前的语句顺序执行,在递归语句之后的语句倒序执行。#实现递归主要是有能够重复print操作的语句。#利用递归正序、倒序输出没有头结点的单链表。

weixin_65259109的博客 475
上一篇: 轻松掌握java读写锁(ReentrantReadWriteLock)的实现原理
下一篇: dubbo负载均衡策略及对应源码分析
还不够
博客等级 码龄16年 113粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值