HashMap
一、概述
HashMap作为面试的常考题,对一个Java开发者来说是要掌握相关知识点的。以下文章是对HashMap的resize()函数流程理解。
二、算法概述
在了解resize()函数之前可以先考一道算法题(如果不想看,可以直接跳过,进入resize()分析),我发现他们有着类似的实现。题目来自《程序员代码面试指南》。不得不佩服左神🐂🍺
题目描述如下:
给定一个链表,再给定一个整数 pivot,请将链表调整为左部分都是值小于 pivot 的节点,中间部分都是值等于 pivot 的节点, 右边部分都是大于 pivot 的节点。
除此之外,对调整后的节点顺序没有更多要求
pivot = 5
7 -> 9 -> 1 -> 8 -> 5 -> 2 -> 5
output:
1 -> 2 -> 5 -> 5 -> 7 -> 9 -> 8
算法思路
- 将原链表中的所有节点依次划分进三个链表,三个链表分别为small代表左部分,equal代表中间部分,big代表右部分。
small:1 -> 2 -> null
equal:5 -> 5 -> null
big: 7 -> 9 -> 8 null
- 将small、equal和big三个链表重新串起来即可。
三、代码实现
注释1,2,3,容易造成链表环状。
public static ListNode listPartition(ListNode head, int pivot) {
ListNode sH = null, sT = null;
ListNode mH = null, mT = null;
ListNode bH = null, bT = null;
ListNode next = null;
while(head != null) {
next = head.next; // 1
head.next = null; // 2
if (head.val < pivot) {
if(sH == null) {
sH = head;
sT = head;
}else {
sT.next = head;
sT = head;
}
}else if (head.val == pivot) {
if (mH == null) {
mH = head;
mT = head;
}else {
mT.next = head;
mT = head;
}
} else