剑指offer刷题3——链表2(简单)
剑指 Offer 24. 反转链表
难度 简单
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
1 | 输入: 1->2->3->4->5->NULL |
限制:
1 | 0 <= 节点个数 <= 5000 |
1.迭代(双指针)
考虑遍历链表,并在访问各节点时修改 next 引用指向,算法流程见注释。
复杂度分析:
时间复杂度 O(N)O(N) : 遍历链表使用线性大小时间。
空间复杂度 O(1)O(1) : 变量 pre 和 cur 使用常数大小额外空间。
代码
1 | /** |
2.递归
考虑使用递归法遍历链表,当越过尾节点后终止递归,在回溯时修改各节点的 next 引用指向。
recur(cur, pre)
递归函数:
终止条件:当 cur 为空,则返回尾节点 pre (即反转链表的头节点);
递归后继节点,记录返回值(即反转链表的头节点)为 res ;
修改当前节点 cur 引用指向前驱节点 pre ;
返回反转链表的头节点 res ;reverseList(head)
函数:
调用并返回 recur(head, null) 。传入 null 是因为反转链表后, head 节点指向 null ;
1 | class Solution { |
剑指 Offer 35. 复杂链表的复制
难度 中等
请实现 copyRandomList
函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next
指针指向下一个节点,还有一个 random
指针指向链表中的任意节点或者 null
。
示例 1:
1 | 输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]] |
示例 2:
1 | 输入:head = [[1,1],[2,1]] |
示例 3:
1 | 输入:head = [[3,null],[3,0],[3,null]] |
示例 4:
1 | 输入:head = [] |
提示:
-10000 <= Node.val <= 10000
Node.random
为空(null)或指向链表中的节点。- 节点数目不超过 1000 。
注意:本题与主站 138 题相同:https://leetcode-cn.com/problems/copy-list-with-random-pointer/
迭代+结点拆分
第一次遍历:在链表各节点中间插入新的节点,复制节点的值
第二次遍历:复制链表各节点的random指向
第三次遍历:分离链表,将两个链表之间的next关系分离形成两个链表
代码
1 | /* |
评论