首页 > 编程知识 正文

写一算法实现单链表的逆置,java递归实现单链表反转

时间:2023-05-03 12:58:46 阅读:33535 作者:198

单链表的反转有单链表。 我们怎么反转他? 这里以leetcode——206为例

主题链接输出按钮https://leet code-cn.com/problems/reverse-linked-list /

目录

一.头节点插入法

二.堆栈

三.三针法

一.头节点插入法

1 .定义表示反转后链表的last的第一个节点

2 .遍历单链表,每次访问一个节点时将此节点插入头,将头插入头。 简言之,单链表分为以head为首的两个部分和以cur为首的两个部分

3 .最后把last清空就行了

注意:这里采用的是没有第一个节点的单链表,head表示第一个节点

publiclistnodereverselist (listnode head ) if ) head==null { return null; } ListNode last=head; //用于表示反转后链表的第一个节点,即反转前的head ListNode cur=head.next; 列表节点模板; wile(cur!=null}{temp=cur; cur=cur.next; temp.next=head; head=temp; } last.next=null; 返回头; } 时间复杂度O(N),空间复杂度O(1)

二.堆栈直接遍历单链表,每次遍历推送当前节点的值放入堆栈,全部遍历后,pop退出堆栈,同时再次遍历原链表,依次更新原链表的值

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

三.三针法的好方法

1 .定义三个指针: pre、cur、curNext,如图所示,进入循环后(cur!=null ),首先curNext=cur.next,如果curNext为空,则表示cur已经是最后的节点,将cur交给newHead,用于返回最后

pre最初是空的

设为cur.next=pre

3 .然后pre=cur; cur=curNext

就这样一直循环着。

4 .出现这种情况后,curNext为空,表示此时的cur是最后一个节点,并在newHead中保存cur

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

publiclistnodereverselist (listnode head ) if ) head==null )返回空值; ListNode cur=head; ListNode pre=null; ListNode curNext=null; ListNode newhead=null; wile(cur!=null(//绘制整个过程以了解curNext=cur.next; if(curnext==null ) (newhead=cur,指示cur已成为最后一个节点; } cur.next=pre; pre=cur; cur=curNext; }返回新头; } 时间复杂度O(N),空间复杂度O(1)

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

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