当前位置:   article > 正文

反转一个单链表(Java)_java单链表反转

java单链表反转

看到反转链表,可能第一时间的想法便是遍历一遍这个单链表,然后把链表里的元素都取出来,放到一个数组里,然后逆置这个数组。这个想法是错的!!!

所以什么是反转链表呢?见下图:

 

反转一个单链表,我们需要的是改变这个链表内节点的指向。

反转链表第一步:

判断链表是否为空,如果链表为空,则直接返回null。

  1. if (this.head == null) { //没有节点
  2. return null;
  3. }

反转链表第二步:

判断链表是否只有一个节点,如果头结点的下一节点等于空,则说明该链表只有一个节点,即返回头结点。

  1. if (this.head.next == null) { //只有一个节点
  2. return this.head;
  3. }

反转链表第三步:

  1. //至少两个节点
  2. Node cur=this.head.next;
  3. this.head.next=null;
  4. while (cur!=null){
  5. Node curNext=cur.next;
  6. cur.next=head;
  7. this.head=cur;
  8. cur=curNext;
  9. }
  10. return head;

第三步详解如下:

链表反转后,它原本的头结点的下一节点就为空null了。但是不能在一开始就将头结点的下一节点置为空。因为将它置为空后,便失去了与链表本来head.next的联系;所以,我们定义一个cur记录头结点下一节点的位置;也就是说让head不动,将记录头结点下一节点位置的cur用头插法的方式插入到head的前边,在cur头插到head前再定义一个curNext记录cur的下一节点,使cur到了head前,也不会失去与后边节点的联系。当所有的链表都反转后,cur就会为空。

图解

 

 

 

 

 

完整代码如下:

  1. class Node{
  2. public int val;
  3. public Node next; //类型是Node null
  4. public Node(int val){
  5. this.val=val;
  6. }
  7. }
  8. public class SingleLinkedList {
  9. public Node head;
  10. //反转链表
  11. //反转链表并不能使用逆置数组,需要改变链表元素的指向(使用头插法)
  12. public Node reverseList() {
  13. if (this.head == null) { //没有节点
  14. return null;
  15. }
  16. if (this.head.next == null) { //只有一个节点
  17. return this.head;
  18. }
  19. //至少有两个节点
  20. Node cur=this.head.next;
  21. this.head.next=null;
  22. while (cur!=null){
  23. Node curNext=cur.next;
  24. cur.next=head;
  25. this.head=cur;
  26. cur=curNext;
  27. }
  28. return head;
  29. }
  30. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/446806
推荐阅读
相关标签
  

闽ICP备14008679号