剑指offer刷题总结之——链表

剑指 Offer 06. 从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

主要通过两种方法:
1.利用栈的后进先出,存入栈后弹出栈存入数据
2.利用递归,注意:list是全局变量
递推阶段: 每次传入 head.next ,以 head == null(即走过链表尾部节点)为递归终止条件,此时直接返回。
回溯阶段: 层层回溯时,将当前节点值加入列表,即tmp.add(head.val)。
最终,将列表 tmp 转化为数组 res ,并返回即可。

剑指 Offer 24. 反转链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

方法一:栈,此时栈的类型是ListNode,先将链表的结点指针入栈,遍历链表,出栈链接链表
方法二:递归,终止条件是当前节点或者下一个节点为null
在函数内部,改变节点的指向,也就是 head 的下一个节点指向 head 递归函数
方法三:双链表,双链表求解是把原链表的结点一个个摘掉,每次摘掉的链表都让他成为新的链表的头结点,然后更新新链表。

剑指 Offer 22. 链表中倒数第k个节点

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。

注意返回类型是Node,不是让你返回倒数第K个的值
方法一:单独指针,需要便利链表,记录总次数count,再重新遍历count-k次即是倒数第k个节点
方法二:快慢指针:快指针先走k步,随后快慢指针一起移动,快指针指向为null时,快指针走完链表总数count,慢指针走的是count-k步同方法一的次数,但只需要遍历一次链表即可。

剑指 Offer 25. 合并两个排序的链表

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

两个链表都不为null时,需要使用两个指针,交替链接
注意:
1.初始化一个伪头节点dum,节点初始化不能为null,否则无法next.
2.若一个链表为null,直接连接到后面
3.返回的是dum.next;

剑指 Offer 35. 复杂链表的复制

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

在这里插入图片描述
简单链表的复制:

Node cur = head;
Node dum = new Nod(0),pre = dum;
while(cur != null){
	Node node =  new Node(cur.val);
	pre.next = node;
	cur = cur.next;
	pre = Node;
}
return dum.next;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值