首页 > 编程知识 正文

单链表反转代码,java单链表反转递归

时间:2023-05-04 18:42:25 阅读:33499 作者:4478

最近,同学向我介绍了lettcode (力按钮) OJ。 就个人而言,该网站比母校OJ、杭电OJ友好得多,杭电OJ接口充足,题库充足,且支持多种主要语言,适合空闲时提高算法能力。 算法练习就像内功的修炼,遇到算法问题,总是觉得无力感,只能慢慢总结。

链表是一种重要的数据结构,具有递归性质,所以很难理解。 我觉得与链表相关的复杂操作总是很混乱。 看别人的安装代码总是看起来很明白很难理解,但读完就会忘记。 其实我还没完全理解。 特意花了一天的时间,重新学习了单链表的常见操作——单链表反转、理解和总结这两种实现方法。

首先,要理解链表节点的数据结构:

value表示存储在该节点上的值,next指向以下节点: next可以是表示单个节点、链表或末尾节点的空值。 http://www.Sina.com/http://www.Sina.com /

创建第一个节点链表的resultList定义了循环链表变量p。 p的初始值是遍历反转对象链表的反转对象链表,遍历条件为(p!=空)

3.1定义用于主循环的临时链表变量tempList,保存p-next的值。

将3.2当前指定的起始节点与resultList链表的起始节点之后的节点连接起来。

3.33.2将步骤连接的节点连接到结果列表头节点后。

3.4 p重新赋值是步骤3.1中保存的tempList的值。 返回resultList-next .即反转的链表。愉快的耳机:头节点插入法

图1是反转的原始链表,图2是开头节点的链表resultList。

可以看出,p是循环变量,初始值指向要反转的原始链表。

使用p变量遍历链表,在遍历过程中(如果枚举的值是第一个循环) :

定义临时链表变量tempList,保存p-next的值。 tempList指向图1.2,将p当前指向的第一个节点(图1.1 )与resultList链表中第一个节点之后的节点(图2.2 )连接起来。 将3.2步连接的节点(图3.2 )连接到结果列表头节点后。 p的重新赋值为在步骤3.1中保存的tempList的值,即图1.2。 最后返回结果列表- next。 也就是说,头部节点-1的值将被移除。

用头节点插入法实现链表翻转功能的主要难点是环路中3.2和3.3步的理解。

需要注意的是循环变量p的值,即指向的变化,传统的扫描过程条件为=null,处理,p=p-next。 但是,在该开头节点插入代码中,p-next的值会发生变化。 为了将resultList结果链表的内容连接到p的第一个节点,定义临时变量并存储p-next。

实现步骤:

头节点插入法的本质是重新创建新的链表。 通过遍历要反转的链表,将链表的每个节点插入到创建的链表中。 然后,此创建的链表是反转的链表。 就地反转是根据反转链表对节点进行重新排序,从而反转链表。 所以原理还是不同的。

图解:

我个人认为,与其插入头部节点,不如当场翻转更难理解。

从宏观上看,要实现节点1和节点2的反转,必须在节点2和节点3之间插入节点1,然后在结果链表的头节点后面插入头节点为2的链表,然后移动另一个节点进行类似的操作。

但是,涉及两个节点的循环赋值时,该操作顺序很重要。

正确的步骤是剪切节点2,然后将节点2插入-1和1之间。

方法二:就地反转

为指向要反转的链表的第一个节点创建链表resultList。 创建p、pNext两个循环操作。 分别指向要反转的两个节点的位置。 初始值如图所示,指向1和2路径反转的链表。 循环条件为pNext。=空值。

3.1从链表中拆分pNext节点。 也就是说,使p指向pNext-next。

3.2使pnext指向3.1操作后的resultlist.next(1-3-4-5)

3.3将结果列表标题指向pnext(2-1-3-4-5)

3.4确保pnext指向p的下一个节点

难点是理解循环中resultList.next的方向性变化以及p和pNext两个变量的变化。 p指向的链表的开头节点始终为1。 但是,节点1在resultList链表中的位置发生了变化,而pNext随着p移动,因此有一个在头的中央排列绳子的模型,在起点的位置施力时,绳子的高度位置会移动到绳子的末尾。 其最高点图解:

头节点插入:

publicstaticlistnodereverselistbyinsert (listnode listnode )//定义读取器节点的listnode result list=new listnode (-1 ); //循环节点

ListNode p = listNode; while(p!= null){ //保存插入点之后的数据 ListNode tempList = p.next; p.next = resultList.next; resultList.next = p; p = tempList; } return resultList.next; }

就地反转:

public static ListNode reverseListByLocal(ListNode listNode){ ListNode resultList = new ListNode(-1); resultList.next= listNode; ListNode p = listNode; ListNode pNext = p.next; while (pNext!=null){ p.next = pNext.next; pNext.next = resultList.next; resultList.next = pNext; pNext=p.next; } return resultList.next; }

单链表的操作困扰了很多年,或许还将困扰下去,但是至少有了更加深入的认识。这部分内容确实相对有点难以理解。推荐的学习方法就是先看别人代码,再画图了解代码的每一个过程,再根据画的图独立写代码实现,然后再调试debug,查看变量变化情况,再找类似练习题,多想多练。(就地反转的方法还需要细讲)。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。