单链表的反转有单链表。 我们怎么反转他? 这里以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进行特判噢