206.反转链表

206.翻转链表

题目

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

提示:

链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解-迭代法

链表的交换,需要知道当前节点和他的前一个节点

class Solution {
    public ListNode reverseList(ListNode head) {
            ListNode pre = null;

            ListNode tmp;
            while(head!=null){
                tmp = head.next; //先把当前元素的后一个元素记录下来,防止断链
                head.next = pre;
                pre=head;
                head=tmp;
            }
            return pre;
    }
}

题解-递归法

递归的终止条件

当遍历到最后一个节点就可以开始返回了

if(head==null||head.next==null)return head;
//head是排除刚进来就为空的情况

递归的单层逻辑
根据下图可以看见,递归的返回最后一个节点,也就是翻转之后的新节点,这个值需要层层传递下去

单层递归需要做的就是,把当前的节点加在翻转成功的节点的后面。


class Solution {
public ListNode reverseList(ListNode head) {
 if(head==null||head.next==null)return head;
	ListNode newHead= reverseList(head.next);
	 head.next.next = head;
	 head.next=null;
     return newHead; //层层传递新的头节点
}

}
posted @ 2022-03-01 10:00  rananie  阅读(34)  评论(0编辑  收藏  举报