链表算法未检测最后元素?影院座位系统漏报末尾空位问题
问题1:我的链表算法为何无法检测到链表的最后一个元素?
这是链表遍历里超常见的小坑,我帮你梳理几个最可能的原因:
遍历终止条件写错了:很多人会用
while(current.next != null)来遍历,这会让循环在倒数第二个节点就停下来,直接跳过最后一个元素。正确的遍历应该用while(current != null),这样能覆盖到最后一个节点。比如:
错误代码:ListNode current = head; while(current.next != null) { // 处理current current = current.next; }正确代码:
ListNode current = head; while(current != null) { // 处理current current = current.next; }循环结束后未处理最后一个元素:如果你的逻辑是在遇到某个条件时处理节点,但最后一个节点不满足触发条件,就会被遗漏。比如统计连续节点时,只在节点变化时记录,最后一段没收尾。这种情况需要在循环结束后额外检查一次最后一个节点的状态。
尾节点的标识逻辑错误:如果你的代码里对尾节点的判断不是
current.next == null(比如自定义了尾节点标记),但标记没正确设置,也会导致最后一个节点不被识别。
问题2:座位系统无法识别最后一个空闲座位(总座位5仅座位5空闲时未被纳入Map)
这个问题几乎可以肯定是遍历结束后没有收尾最后一段连续空闲座位。我给你拆解下逻辑:
假设你的代码逻辑大概是这样的:遍历每个座位,遇到空闲座位就记录起始位置,遇到已占用座位时,就把之前记录的连续空闲座位存入Map。但如果最后一个座位是空闲的,遍历结束后没有触发“遇到已占用座位”的逻辑,这段空闲座位就被漏掉了。
举个例子,错误的核心逻辑可能是:
Map<Integer, Integer> freeSeatsMap = new HashMap<>(); int startFree = -1; for (int seatNum = 1; seatNum <= seatCount; seatNum++) { if (isSeatAvailable(seatNum)) { if (startFree == -1) { startFree = seatNum; // 标记连续空闲的起始位置 } } else { // 遇到已占用座位,把之前的连续空闲座位存入Map if (startFree != -1) { freeSeatsMap.put(startFree, seatNum - startFree); startFree = -1; } } } // 这里!遍历结束后如果startFree还不等于-1,说明最后一段是空闲的,需要手动存入
解决办法就是在循环结束后,加上一段收尾逻辑:
// 遍历结束后检查是否还有未存入的连续空闲座位 if (startFree != -1) { freeSeatsMap.put(startFree, seatCount - startFree + 1); }
这样当总座位5且只有座位5空闲时,startFree会被设为5,循环结束后触发这段逻辑,把5-1存入Map,就不会遗漏了。
内容的提问来源于stack exchange,提问作者user8827176
相关产品推荐
相关产品推荐

