leetcode 206.反转链表(链表)

题目描述

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

解法

1.迭代

图解:

在这里插入图片描述

代码实现:

public ListNode reverseList(ListNode head) {
    //定义两个结点:前结点,当前结点
    ListNode pre = null;
    ListNode cur = head;
    /*思路
		 *	1 -> 2 -> 3 -> 4 -> 5 -> null
		 *	null <- 1 <- 2 <- 3 <- 4 <- 5
		 */
    while(cur!=null) {
        ListNode temp = cur.next;
        cur.next = pre;
        pre = cur;
        cur = temp;
    }
    return pre;
}

时间复杂度:O(n),假设 n 是列表的长度,时间复杂度是 O(n)。
空间复杂度:O(1)。

2.递归

图解:

在这里插入图片描述

代码实现:

public ListNode reverseList(ListNode head) {
    if(head==null||head.next==null)return head;
    ListNode cur = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return cur;
}

此递归较难理解,在此引用leetcode用户懒懒米虫的思路

不妨假设链表为1,2,3,4,5。按照递归,当执行reverseList(5)的时候返回了5这个节点,reverseList(4)中的p就是5这个节点,我们看看reverseList(4)接下来执行完之后,5->next = 4, 4->next = null。这时候返回了p这个节点,也就是链表5->4->null,接下来执行reverseList(3),代码解析为4->next = 3,3->next = null,这个时候p就变成了,5->4->3->null, reverseList(2), reverseList(1)依次类推,p就是:5->4->3->2->1->null

可能这个看完了你还是不明白为什么返回cur,这里给出自己的理解

第一个if判断第一次触发终止条件时head=5,然后下一层 ListNode cur = reverseList(head.next);

cur拿到的就是5即cur=5,即首地址就为5的那个,然后后面递归完成我们可以通过首地址访问到一整个链表

结语

今天JD3:0FPX属实上流哦🍷

昔日御三家,如今六七八。昔日世界冠,如今季军战

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值