`
cq520
  • 浏览: 165440 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

单向链表的翻转

阅读更多

       单向链表翻转,之前把这个问题想的太简单了,以为只要把数据域翻转过来就可以了,结果是筐了大瓢,下面举一个简单的例子说明:

       假设有n个人站成一排,现在要把这n个人的站的顺序颠倒过来,那么就不能只把这n个人的身高颠倒过来,而是要把每一个人的位置颠倒过来,第一个人站到最后,第二个人站倒数第二,以此类推。

       为了检验程序的正确性,这一次我们打印时不能再打印结点数据,而要打印结点Java程序运行时,JVM为程序开辟了内存空间,每一个结点在栈中都有一个保存的位置,要注意的是,每次程序运行时某一个结点在内存中保存的位置并不是一定的,所以进行方法测试的时候一定要在一次运行中进行测试,这也是之前我一直纠结的问题,为什么打印的结点元素对了,但是结点却不同。

       下面来讲解一下我实现链表翻转的过程,在讲解正确方法之前先来看一下假翻转:

 

public void wrongturn(){
	for(int i=1;i<size();i++){
		insert(i,get(size()).obj);
		delete(size());
	}
}

这里的insert方法详见于我的上一篇博客当中

http://cq520.iteye.com/blog/1860061,这种做法的意思是,先把所有的结点都复制出来,再逆置插入链表中,每次插入之后就把最后一个多出来的结点删除掉,如果你只打印当前的链表元素很容易就被这种方法蒙蔽了,不过很明显,这种做法虽然能够达到逆置的效果,但是逆置的结点却全都变了,就像你换了一帮人来做这件事情一样,它们操作的内存地址不是同一块。

下面讲解正确的方法:

这是一个单链表:

 

 

1.       把尾结点放在首结点的前面,把首结点向后推移

 

 

2.       把当前的最后一个结点依次插入到链表的下一个位置

 

 

这句话大家可能有点不理解,其实在执行完第一步之后链表的长度并没变,只是最后一个结点已经变成了之前的倒数第二个结点,然后接下来要做的事情就是把当前的最后一个结点连接到新的头结点后面去(意思就是插入到第二个位置,这个头结点就是没变换前的last结点),执行完这一步之后,最后一个结点又会向前推移,变成倒数第三个结点,再把倒数第三个结点插入到第三个位置以此类推。

代码如下 :

/**
 * 翻转链表的方法
 */
public void turn(){
	//先把最后一个结点放在首结点的位置
	last.next=head;
	head=last;
        //依次从头到尾插入结点
	for(int i=1;i<size();i++){
		get(size()).next=get(i).next;
		get(i).next=get(size());
	}
	get(size()).next=null;
}

 

逆置的问题在实现上其实并不难,但是理解起来却并不容易,需要攻克的地方在于不要让同一块内存保存两个数据,也不要让链表中任何一个结点失去引用,而且原来结点在内存中表示也不要改变,这也是结点在引用时最容易看蒙的。

这只是实现翻转的一种方法,当然还有更多的方法等待挖掘,一些朋友们已经写出了其他的方法,希望大家也一起来寻找更多更好的方法。

  • 大小: 19.2 KB
  • 大小: 22.6 KB
  • 大小: 34.2 KB
1
1
分享到:
评论

相关推荐

    C#单向链表的实现

    C#单向链表的实现的源码

    单向链表多种功能实现

    单向链表的建立、添加、删除、翻转(含递归翻转)、合并、查找回路、定位回路起点功能的实现。

    面试单链表问题总结-反转,逆序输出,判环,求交点

    由于要面试所以总结了面试中经常出现的关于单链表方面的问题,希望对大家有所帮助

    LeetCode-[链表]-翻转链表

    翻转链表需要注意的一点是:链表之间靠指针连接,如果贸然将某个节点的next指向其他节点,就有可能造成该节点的丢失,所以翻转链表时(单向或双向),都要注意保存它的周围环境。 时间复杂度:O(n) 空间复杂度:O(1)...

    如何使用递归和非递归方式反转单向链表

    以下是对使用递归和非递归方式反转单向链表的示例进行了详细的分析介绍,需要的朋友可以过来参考下

    C语言 数据结构之单链表基本操作

    单链表的各种操作,适合于初学,也适合于复习 单链表操作介绍 1. 创建头节点 ...12. 面试中常见:单链表翻转 13. 已知两个链表head1和head2各自有序,请把它们合并成一个链表依然有序,要求用递归方法

    leetcode530-leetcode:leetcode

    翻转单向链表 237 删除链表元素 203 删除链表多个元素 206 翻转链表 141 环形链表 2021-05-15: 876 获取链表中间节点 20 判断括号是否成对 2021-05-16: 150后缀表达式 224基本计算器 856计算括号分数 232 用栈实现...

    自己整理的C/C++笔试、面试题(完整)

    对于链表翻转的问题,题目给出了正确答案,这是通过交换当前节点与其后继节点的链接来实现的。这个算法在链表的每个节点上迭代,直到达到尾部,最后将头指针更新为原来的尾节点。 最后,关于JavaScript的题目,删除...

    leetcode147-algorithm:leetcode

    单向链表结构定义如下: struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; 1、翻转链表 递归解法 设置递归函数的返回值为翻转后链表的首节点 递归终止条件为空节点或节点...

    LeetCode判断字符串是否循环-leetcode:leetcode练习

    单向链表中涉及链表中两个节点需要相互比较的场景 单项链表指针修改(翻转,两侧插入等涉及多点指针修改场景) 常见题目 找到链表的中间节点-快慢指针 翻转链表-pre,op, post多指针 dummy node/哨兵节点 使用场景 ...

    数据结构课程设计报告—纸牌游戏.pdf

    该设计旨在解决约瑟夫环问题,即使用单向循环链表来模拟约瑟夫环的过程,输出各个人的编号。该设计使用了一个链表来存储每个人的编号和密码,并使用循环来实现约瑟夫环的过程。 该设计的主要功能是提供用户从键盘...

    前端大厂最新面试题-算法.docx

    * 链表:反转单向链表、链表的遍历和操作。 * 动态规划:爬楼梯问题、递归方法分析、备忘录方法、迭代法等。 经典面试题 * JS 实现一个函数,完成超过范围的两个大整数相加功能 * JS 如何实现数组扁平化? * JS ...

    大厂学院算法与数据结构解析课程大纲1

    链表作为基础数据结构,课程会深入讲解单向链表、双向链表和循环链表,并通过实际题目,如反转链表、合并两个有序链表和删除倒数第N个节点,让学员熟悉链表的操作。 哈希表是无处不在的数据结构,课程将讨论其Java...

    ProgrammingPracticeFirstSemester:编程实践。 我学期

    翻转列表 你得到一个单向链表。 反方向翻过来。 原始列表可能会被破坏。 任务 3. 找出数组的第 k 个升序元素的值 输入是一个数字数组和数字 k。 不要使用排序,渐近复杂度是 O(N)。 阵列可能已损坏。 任务 4. 翻转...

    2018秋招java笔试题-java_review:Java评论

    以组为单位翻转单向链表, 头插法翻转 2021.3.25 vivo2021届秋季校招在线编程 编译依赖问题, 拓扑排序 回文字符串, 暴力 游戏地图路径, dfs/bfs/A* (代码待完善) 2021.3.24 上海耀乘健康科技有限公司笔试 2021.3.15 ...

    leetcode添加元素使和等于-Coding-Interview-Guide:Python语言实现左程云《程序员代码面试指南》第二版

    leetcode添加元素使和等于 Coding-Interview-Guide 左程云《程序员代码面试指南》第二版编程题的Python语言实现 牛客网OJ: LeetCode: 1、故下面除特殊说明,否则OJ链接均默认为LeetCode对应题目链接。...翻转单向和双

    Visual C#.NET 2008程序设计案例集锦 (源码)

    案例8.1 单向链表数据结构 案例8.2 堆栈数据结构 案例8.3 队列数据结构 案例8.4 冒泡排序和选择排序 案例8.5 希尔排序和插入排序 案例8.6 搬砖问题算法 案例8.7 爱因斯坦的阶梯问题算法 案例8.8 求最大公因子...

    c语言经典案例

    实例198 创建单向链表 282 实例199 创建双向链表 284 实例200 创建循环链表 287 实例201 使用头插入法建立单链表 289 实例202 双链表逆序输出 291 实例203 约瑟夫环 293 实例204 创建顺序表并插入元素 294 实例205 ...

    世界500强面试题.pdf

    1.3.2. 输入一个单向链表,输出该链表中倒数第 k 个结点............................. 44 1.3.3. 输入一个已经按升序排序过的数组和一个数字.................................... 46 1.3.4. 输入一颗二元查找树,...

Global site tag (gtag.js) - Google Analytics