赞
踩
单链表的反转,有一个单链表,我们要如何对他进行反转呢?这里我们以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进行特判噢
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。