java实现链表反转
为什么面试常考链表反转
链表是常用的数据结构,同时也是面试常考点,链表为什么常考,因为链表手写时,大多都会有许多坑,比如在添加节点时因为顺序不对的话会让引用指向自己,因此会导致内存泄漏等问题,Java会有JVM管理内存,可能不会引起太大问题,如果是c、c++、c#,这些语言都需要手动释放内存,如果操作不当后果不堪设想。其原因就是程序员对(引用)指针的理解出现偏差。
如果不了解Java引用可以查看这篇博客:
怎样实现链表反转
翻转链表实现如下:
public class Link {
Node head;
public void reverse() {
if (head.isEmpty() || head.next.isEmpty()) return;
Node cur = head.next;
Node pre = head;
while (cur!=null) {
Node tmp = cur.next;
cur.next = pre; //变成了 cur-》pre-》源cur.next节点
head.next = tmp;
//2->1->3 c:3 p:2 3->2->4(1节点直接被4覆盖),需要修改
pre = cur;
cur = tmp;
tmp = null; //垃圾回收
}
head = pre;
}
public boolean isEmpty() {
return head == null;
}
}
class Node {
int val;
Node next;
public Node(int val) {
this.val = val;
next = null;
}
public boolean isEmpty() {
return this == null;
}
@Override
public String toString() {
return "Node{" +
"val=" + val +
", next=" + next +
'}';
}
}
分析思路:
一般尝试,如果直接while让cur.next=cur;在cur.next=cur之前拿到cur.next的下一个节点,会出现子级指向自己的死环,这是不可取的。
换一个方法,如果多添加一个是否会有帮助,添加一个pre=head引用,让cur移动一个单位,现在cur从head.next的位置,让cur的下一个位置
保存pre引用的地址,在cur的下一位置重新指向前事先让pre指向cur.next节点
源码如下:
while ()
{
pre.next = cur.next;
cur.next = pre; //变成了 cur-》pre-》源cur.next节点
Node tmp = pre; //2->1->3 c:3 p:2 3->2->4(1节点直接被4覆盖),需要修改
pre = cur;
cur = tmp;
tmp = null; //垃圾回收
}
很明显,源码中并没有未排序的部分添加到链表尾部,而是直接放到了pre节点的后边,造成了污染数据的后果,经过修改后就是上面带实现类源码。
如果不明白为什么是head.next=tmp;假如有一个链表是1->2->3->4,第一次翻转时候都是让cur放到pre的前面,再把没有排序的部分放到后边,如果第二次在按照这个思路跑的话,就会变成3->2->4,就会把原来2后边的1覆盖了,这里就有问题了,后边的节点不应该放到2后边,而是应该放到1,这个1正好是原来链表的head节点,所以每次添加的位置应该是head后边。
最后结果
最后跑完的结果是:
DEBUG:
Node{val=4, next=Node{val=3, next=Node{val=2, next=Node{val=1, next=null}}}}
java实现链表反转的更多相关文章
- Java单链表反转 详细过程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guyuealian/article/details/51119499 Java单链表反转 Java实 ...
- Java单链表反转图文详解
Java单链表反转图文详解 最近在回顾链表反转问题中,突然有一些新的发现和收获,特此整理一下,与大家分享 背景回顾 单链表的存储结构如图: 数据域存放数据元素,指针域存放后继结点地址 我们以一条 N1 ...
- java 单链表反转
最近与人瞎聊,聊到各大厂的面试题,其中有一个就是用java实现单链表反转.闲来无事,决定就这个问题进行一番尝试. 1.准备链表 准备一个由DataNode组成的单向链表,DataNode如下: pub ...
- java单链表反转
今天做leetcode,遇到了单链表反转.研究了半天还搞的不是太懂,先做个笔记吧 参考:http://blog.csdn.net/guyuealian/article/details/51119499 ...
- java单链表反转(花了半个多小时的作品)
欢迎光临............... 首先我们要搞清楚链表是啥玩意儿?先看看定义: 讲链表之前我们先说说Java内存的分配情况:我们new对象的时候,会在java堆中为对象分配内存,当我们调用方法的 ...
- java实现 链表反转
输入一个链表,反转链表后,输出新链表的表头. 递归法 public class RevnNode { public static class Node { public int value; publ ...
- Java实现链表反转(借助栈实现)
public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } // 添加新的 ...
- 【Java数据结构】Java数据结构之链表反转
我们都知道用C可以很简单的实现单链表反转,今天来学习下,在Java中如何实现链表反转. 思路很简单,定义一个类,这个类分成2块,一块是表示自身的标志,另外一个存储指向下一个元素的引用.通过互换相邻两个 ...
- 单链表反转(Singly Linked Lists in Java)
单链表反转(Singly Linked Lists in Java) 博客分类: 数据结构及算法 package dsa.linkedlist; public class Node<E> ...
随机推荐
- 问题 C: 最短路径
问题 C: 最短路径 在洛谷上刷最短路的题然后被老师拉回去做算法笔记上面的题... 拿到这道题,先确定所有路径唯一,然后是无向边,那么对于边权处理,直接赋值为2的k次方就可以了,然后直接跑最短路. 这 ...
- dll备份注意事项
test.dll20161111和test.dll同目录的时候,会报错!因为这样跟test1.dll(只是重名民)的效果是一样的,都会报错的. 同目录的情况下,应该改成test.dll.ddd. 为了 ...
- 模型评测之IoU,mAP,ROC,AUC
IOU 在目标检测算法中,交并比Intersection-over-Union,IoU是一个流行的评测方式,是指产生的候选框candidate bound与原标记框ground truth bound ...
- ORA-04063: package body "DBSNMP.BSLN_INTERNAL" has errors
ORA-04063: package body "DBSNMP.BSLN_INTERNAL" has errors 问题描述: 警告日志出现报错: Sun Jun 21 00:00 ...
- 《MapReduce: Simplified Data Processing on Large Clusters》论文研读
MapReduce 论文研读 说明:本文为论文 <MapReduce: Simplified Data Processing on Large Clusters> 的个人理解,难免有理解不 ...
- kubernetes-pod驱逐机制
1.驱逐策略 kubelet持续监控主机的资源使用情况,并尽量防止计算资源被耗尽.一旦出现资源紧缺的迹象,kubelet就会主动终止部分pod的运行,以回收资源. 2.驱逐信号 以下是一些kubele ...
- Instrction Arrangement UDH 4109 拓扑排序 or 最长路
题目描述 Ali has taken the Computer Organization and Architecture course this term. He learned that ther ...
- C/C++代码覆盖率统计工具:gcov&&gcovr安装和简单使用
gcov安装 Linux ver: gcov是gcc的自带功能 属于GNU 不用特别安装 Windows ver: 在windows下安装可以使用gcov的gcc 之前试过mingw和Cygwin64 ...
- Python OpenCV的绘图功能简介
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:大Z 在图像中我们经常需要用到将某个局部特征画出来,比如物体检测,物 ...
- 关于点击input框唤醒键盘导致input被遮盖的问题
关于点击input框唤醒键盘导致input被遮盖的问题 这个问题相信大家在实际开发过程当中都有遇见,我自己也遇见过很多次.之前在百度上看见大多数的方法利用的都是键盘唤醒了之后,页面的实际高度会发生变化 ...