为什么面试链表会反转
链表是一种常用的数据结构,同时也是面试的惯用手段。 要说链表为什么频繁报考,那是因为在链表上手写的话,有很多漏洞。 例如,如果添加节点时顺序错误,则引用会指向自己,从而发生内存泄漏等问题。 因为Java有JVM管理内存,所以可能不太成问题。 如果是c、c、c#,这些语言需要手动释放内存,无法想象操作不当的结果。 其理由是对程序员指针的理解有偏差。
如果您不知道Java引用,请参阅此博客:
参照你不知道的Java
实现链表翻转的方法
反转链表后,如下所示:
公共类链接{
节点头;
公共语音恢复(
if (head.isempty (|head.next.isempty ) ) return;
Node cur=head.next;
节点pre=head;
wile(cur!=空) {
Node tmp=cur.next;
cur.next=pre; //cur -’pre -’已成为源cur.next节点
head.next=tmp;
//2-1-3c:3p:23-2-4(1节点直接用4覆盖),需要修改
pre=cur;
cur=tmp;
tmp=null; //垃圾回收
}
head=pre;
}
公共布尔输入
返回头==null;
}
}
类节点{
int val;
节点下一步;
公共节点(空闲) {
this.val=val;
下一个=null;
}
公共布尔输入
返回this==null;
}
@Override
公共字符串字符串
返回节点{
' 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节点
节点tmp=pre; //2-1-3c:3p:23-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。 这里有问题。 后面的节点应该放在1,而不是2后面。 这一个正好是原始链表的
最后的结果
最后跑的结果:
DEBUG:
Node{val=4,next=Node{val=3,next=Node{val=2,next=Node{val=1,next=null}}}}