You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归实现循环双向链表长度统计的问题求助

解决循环双向链表递归求长度的问题

原方案的问题

你原来的思路通过修改节点元素标记已访问,存在两个致命问题:

  • 彻底破坏链表原始数据,调用完size方法后所有节点的element都会被设为null,链表直接报废
  • 如果链表中本身存在element为null的节点,会提前触发终止条件,导致计算结果错误

正确的递归实现思路

循环链表的终止条件是遍历回到起点,但主方法只能传入头节点,因此需要借助辅助递归方法,额外传递起始节点(原头节点)作为终止判断的依据,全程不修改链表任何数据。

代码实现

假设ListNode包含next双向指针:

public class Solution {
    public int size(ListNode head) {
        // 处理空链表场景
        if (head == null) {
            return 0;
        }
        // 初始计数包含头节点本身,后续从下一个节点开始递归
        return 1 + sizeHelper(head.next, head);
    }

    // 辅助递归方法:current为当前遍历节点,start为起始节点(原头节点)
    private int sizeHelper(ListNode current, ListNode start) {
        // 终止条件:回到起始节点,说明遍历完整个循环链表
        if (current == start) {
            return 0;
        }
        // 递归遍历下一个节点,累加计数
        return 1 + sizeHelper(current.next, start);
    }
}

逻辑说明

  • 主方法先判断空链表,再以头节点为起点,初始计数+1(包含头节点),调用辅助方法遍历后续节点
  • 辅助方法每次检查当前节点是否回到起始节点,是则终止递归返回0,否则继续递归并累加计数
  • 全程不修改链表数据,完全保留原始结构;双向链表用current.next或current.prev遍历逻辑一致

边界情况覆盖

  • 空链表:直接返回0
  • 单节点循环链表:head.next指向自身,辅助方法直接返回0,最终结果为1,符合预期

内容的提问来源于stack exchange,提问作者Cosmo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:00:57