二、链表
1.复制带随机指针的链表
第一步:将链表的每一个节点后面都新建一个和该节点值一样的节点,
第二步:根据老节点的rand指针将新节点的rand指针添加上,
第三步:将链表按照奇偶数分成两个链表,取第二个链表
注意: 首先要判空,第二要注意复制前的链表的结点的random为空情况的判断
2.分隔链表
笔试:把单链表放到数组里,用partition,数组排序后用node穿起来,申请node类型的数组,然后串起来
面试:六个变量,小于部分的头和尾,等于部分的头和尾,大于部分的头和尾
3.回文链表的判断
方法1:快慢指针,找到中间的节点,将后一半的节点放在栈里,最后从头结点开始和栈中的第一个元素作比较判断是不是回文
方法2:快慢指针先找到中间节点,然后后面的节点反转过来,最后从两头的头节点开始判断是不是回文
4. 排序链表
5. 反转链表
虽然简单,但是要多练习
6. 旋转链表
题目描述:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
方法一:循环遍历链表,找到新的头结点,将旧头结点指向链表尾部
方法二(推荐):先找到链表的最后一个节点,同时计算出链表的长度,根据K值计算出第几个结点为新的头结点,断开头结点和上一个结点的链接,同时将旧头结点指向链表尾部
7. 合并两个有序链表
easy
8. 两两交换链表中的节点
方法一:笨方法,依次将两个节点互换,直到链表中就剩下一个节点或无节点
方法二: 递归方法,非常好的思路,具体实现可看code
9. 表中环的入口节点
方法一:可通过快慢指针的方式,当快指针和慢指针相遇的时候,慢指针指向头指针,接下来慢指针和快指针都一步一步走,再相遇的时候就是环的入口节点。
方法二:哈希表法,遍历链表,若节点不在hash表里,则将该节点加到hash表中,若节点在hash表中,则说明该节点为入口节点。 记得判断无环情况