力扣题目学习笔记(OC + Swift)206. 反转链表

206. 反转链表

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

示例

方法一、迭代

在遍历链表时,将当前节点的 next\textit{next}next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。

复杂度分析

时间复杂度:O(n),其中 nnn 是链表的长度。需要遍历链表一次。

空间复杂度:O(1)。

Swift

swift 复制代码
//迭代法
    func reverseList(_ head: ListNode?) -> ListNode? {
        var previ: ListNode?
        var cur = head
        
        while cur != nil {
            let nex = cur?.next
            cur?.next = previ
            previ = cur
            cur = nex
        }
        
        return previ
    }

OC

c 复制代码
//迭代
-(ListNodeOC *)reverseList:(ListNodeOC *)head {
    ListNodeOC *pre = nil;
    ListNodeOC *cur = head;
    
    while (cur != nil) {
        ListNodeOC *nex = cur.next;
        cur.next = pre;
        pre = cur;
        cur = nex;
    }
    
    return pre;
}

方法二、递归

递归版本稍微复杂一些,其关键在于反向工作。假设链表的其余部分已经被反转,现在应该如何反转它前面的部分?

比较抽象,直观理解是把head和除head之外的部分看成两个部分,head已不需要翻转,另一部分需要调用自己继续完成翻转,最后重新组织前后依赖关系,注意新链表的尾部节点的next为空,否则会引入循环。

复杂度分析

时间复杂度:O(n),其中 nnn 是链表的长度。需要遍历链表一次。

空间复杂度:O(n)。

Swift

swift 复制代码
    func reverseList(_ head: ListNode?) -> ListNode? {
        // 递归终止条件
        if head == nil || head?.next == nil {
            return head
        }
        
        let next = head?.next
        let node = reverseList(next)
        head?.next = nil
        next?.next = head
        return node
    }

OC

c 复制代码
-(ListNodeOC *)reverseList:(ListNodeOC *)head {
    //递归终止条件
    if (!head || !head.next) {
        return head;
    }

    ListNodeOC *next = head.next;
    ListNodeOC *node = [self reverseList:next];
    
    head.next = nil;
    next.next = head;
    
    return node;
}
相关推荐
RainCity2 天前
Java Swing 自定义组件库分享(十二)
java·笔记·后端
To_OC2 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC2 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
To_OC4 天前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
To_OC4 天前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
To_OC4 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
To_OC7 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
To_OC8 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
LinXunFeng9 天前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
通信小呆呆14 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人