当前位置:   article > 正文

Java~链表反转/链表逆置的多种方法(超详细,含完整代码)_java 反转链表有什么作用

java 反转链表有什么作用

 单链表的反转,有一个单链表,我们要如何对他进行反转呢?这里我们以leetcode——206为例子

附上题目链接力扣https://leetcode-cn.com/problems/reverse-linked-list/


目录

一.头结点插入法

二.栈

三.三指针法


一.头结点插入法

1.先定义一个last用于表示反转后链表的第一个结点 

2.然后遍历单链表,每访问一个结点就将这个结点进行头插,头插到最前面,说白了就是把单链表分成了两个部分,一个是以head为首,一个是以cur为首

3.最后把last置空即可

注:这里我们采用的是不带头结点的单链表,head表示的是第一个结点

 

 

  1. public ListNode reverseList(ListNode head) {
  2. if (head == null){
  3. return null;
  4. }
  5. ListNode last = head; //用于表示反转后链表的第一个结点 ,也就是反转之前的head
  6. ListNode cur = head.next;
  7. ListNode temp;
  8. while (cur != null){
  9. temp = cur;
  10. cur = cur.next;
  11. temp.next = head;
  12. head = temp;
  13. }
  14. last.next = null;
  15. return head;
  16. }

时间复杂度O(N),空间复杂度O(1)


二.栈

直接遍历单链表,每次遍历把当前结点的数值push入栈,全部遍历后,pop出栈,同时再遍历一遍原链表依次更新原链表的数值

时间复杂度O(N),空间复杂度O(N)


三.三指针法

一个很好的方法

1.定义三个指针,pre,cur,curNext,如图所示,进入循环后(cur != null),先让curNext = cur.next,若curNext为空,则表示cur已经是最后一个结点,把cur给到newHead,最后用来返回

pre一开始是Null

2.让cur.next = pre

 3.然后pre = cur; cur = curNext

 就这样一直循环。。。。。。。。

 4.到这种情况后,curNext为空,表示此时的cur已经是最后一个结点,用newHead保存cur

 5.最后cur == null,退出循环,程序结束

  1. public ListNode reverseList(ListNode head) {
  2. if (head == null)
  3. return null;
  4. ListNode cur = head;
  5. ListNode pre = null;
  6. ListNode curNext = null;
  7. ListNode newhead = null;
  8. while (cur != null){ //整个过程画图理解
  9. curNext = cur.next;
  10. if (curNext == null){ //表明cur已经是最后一个结点了
  11. newhead = cur;
  12. }
  13. cur.next = pre;
  14. pre = cur;
  15. cur = curNext;
  16. }
  17. return newhead;
  18. }

 时间复杂度O(N),空间复杂度O(1)


最后要注意一点就是,要对head == null进行特判噢

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

闽ICP备14008679号