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

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

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


目录

一.头结点插入法

二.栈

三.三指针法


一.头结点插入法

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

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

3.最后把last置空即可

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

 

 

public ListNode reverseList(ListNode head) {
    if (head == null){
        return null;
    }

    ListNode last = head;    //用于表示反转后链表的第一个结点 ,也就是反转之前的head
    ListNode cur = head.next;
    ListNode temp;

    while (cur != null){
        temp = cur;
        cur = cur.next;
        temp.next = head;
        head = temp;
    }
    last.next = null;
    return head;
}

时间复杂度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,退出循环,程序结束

public ListNode reverseList(ListNode head) {
    if (head == null)
        return null;
    ListNode cur = head;
    ListNode pre = null;
    ListNode curNext = null;
    ListNode newhead = null;
    while (cur != null){   //整个过程画图理解
        curNext = cur.next;
        if (curNext == null){   //表明cur已经是最后一个结点了
            newhead = cur;
        }
        cur.next = pre;
        pre = cur;
        cur = curNext;
    }
    return newhead;
}

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


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

  • 13
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值