剑指 Offer 06. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
1 | 输入:head = [1,3,2] |
限制:
0 <= 链表长度 <= 10000
题解
逐次遍历链表,并将val放入辅助栈中,再对辅助栈进行出栈,将结果保存在一个数组中
1 | /** |
注:
stack.size()方法的返回值表示stack栈的大小,当出栈后,size()的返回值就会发生改变,所以应该用一个变量size记录stack的大小,而不是直接使用stack.size()
剑指 Offer 24. 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
1 | 0 <= 节点个数 <= 5000 |
注意:本题与主站 206 题相同:https://leetcode-cn.com/problems/reverse-linked-list/
题解
思路一
正好上一题使用stack实现了从尾到头打印链表,所以沿用上一题的算法:
1 | /** |
思路二
双指针
- 复制head指向的节点,使用temp指代;
- temp的下一个节点为NULL;
- head指针向后移动;
- 再声明一个pre指针指向temp;
- 当head不是空链表时:
- 复制head指向的节点,使用temp1指代;(这里编译器说temp已经使用过了,不能再用了;但其实temp已经没用了,覆盖了也没事)
- temp1的下个节点指向pre;(这一步将head指向的节点接在了新链表的头)
- 更新pre
- head指针向后移动
循环体中的语句其实与前面的语句功能很相似,但为了让第一个节点的next为NULL,所以需要特殊处理
1 | /** |
剑指 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 = [] |
提示:
1 | -10000 <= Node.val <= 10000 |
注意:本题与主站 138 题相同:https://leetcode-cn.com/problems/copy-list-with-random-pointer/
题解
一开始没理解懂题意,写的脑残代码,next
和random
字段是不能直接复制的,要不指向的就是原链表的各个节点了.这题简单理解就是深拷贝还是参考了官网题解,递归或者叫回溯,解决的真的很巧啊,法二更是秀了我一脸.
我就记录一下使用map记录映射的方法吧:
使用map,将旧节点与新节点做了映射.因为旧节点为key,所以复制的时候,只有一个对应的新节点会被创建,并与旧节点做映射,而headNew的next
和random
字段都是通过递归函数赋值的.
1 | /* |
看到有位叫eipip1e0的同学写的代码感觉更好理解一些,我就臭不要脸的放这里记录一下了:
1 | class Solution { |