首页 > 编程知识 正文

Java实现链表,反转链表java实现

时间:2023-05-05 13:25:21 阅读:33492 作者:2484

为什么面试链表会反转

链表是一种常用的数据结构,同时也是面试的惯用手段。 要说链表为什么频繁报考,那是因为在链表上手写的话,有很多漏洞。 例如,如果添加节点时顺序错误,则引用会指向自己,从而发生内存泄漏等问题。 因为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}}}}

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