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

Java链表添加未知数量节点问题:实现无长度限制整数存储

看起来你在实现基于链表的大整数存储时遇到了字符串拆分和逆序存储的问题,我来给你梳理下解决方案:

解决逆序拆分字符串并构建链表的问题

核心思路

要实现每个节点存3位数字且逆序存储的需求,关键是从字符串的末尾开始向前拆分:每次取最多3位字符转成int,再依次添加到链表中。比如数字"123456",先处理最后3位"456",再处理前面的"123",这样链表的节点顺序就是456 → 123,正好符合要求。

具体步骤与代码示例

假设你已经定义了基础的链表节点结构(包含value存储3位整数、next指针),下面是构造函数的实现思路(以Java为例,你可以根据使用的语言调整):

1. 先处理边界情况

比如空字符串、长度不足3位的输入(比如"12"直接存12,"1"存1)。

2. 从后向前遍历拆分字符串

用索引从字符串末尾开始,每次往前移动3位,截取子串转int后添加到链表。

public class BigNumberLinkedList {
    private Node head;

    // 内部节点类
    private static class Node {
        int value;
        Node next;
        Node(int value) {
            this.value = value;
            this.next = null;
        }
    }

    // 构造函数:传入数字字符串初始化链表
    public BigNumberLinkedList(String numStr) {
        if (numStr == null || numStr.isEmpty()) {
            throw new IllegalArgumentException("数字字符串不能为空");
        }

        int currentIndex = numStr.length() - 1;
        while (currentIndex >= 0) {
            // 计算当前截取的起始位置:剩余字符不足3位时从0开始
            int startIndex = Math.max(0, currentIndex - 2);
            // 截取子串(注意字符串substring是左闭右开,所以结束索引是currentIndex+1)
            String chunk = numStr.substring(startIndex, currentIndex + 1);
            // 转成int类型
            int numChunk = Integer.parseInt(chunk);
            // 将当前数字组添加到链表头部
            addNodeToHead(numChunk);
            // 索引向前移动3位,处理下一组
            currentIndex -= 3;
        }
    }

    // 辅助方法:向链表头部添加节点
    private void addNodeToHead(int value) {
        Node newNode = new Node(value);
        if (head == null) {
            head = newNode;
        } else {
            newNode.next = head;
            head = newNode;
        }
    }

    // 测试用:打印链表内容
    public void printLinkedList() {
        Node current = head;
        while (current != null) {
            System.out.print(current.value + " -> ");
            current = current.next;
        }
        System.out.println("null");
    }

    // 测试示例
    public static void main(String[] args) {
        BigNumberLinkedList num1 = new BigNumberLinkedList("123456");
        num1.printLinkedList(); // 输出:456 -> 123 -> null
        BigNumberLinkedList num2 = new BigNumberLinkedList("1234");
        num2.printLinkedList(); // 输出:234 -> 1 -> null
    }
}

关键细节解释

  • 逆序截取逻辑:通过currentIndex从字符串末尾开始遍历,确保先处理数字的低位部分,添加到链表头部后,自然形成逆序存储的结构。
  • 处理不足3位的情况:用Math.max(0, currentIndex - 2)避免索引越界,比如字符串长度为4时,第一次截取"234",第二次截取"1"。
  • 链表添加方式:选择头部添加是因为每次处理的是当前最末尾的数字组,头部添加能保证链表顺序符合需求,且时间效率更高。如果习惯尾部添加,可以先把所有数字组存入列表,再逆序遍历列表添加到链表尾部。

排查你当前的问题

你之前无法正确遍历添加,大概率是正向遍历字符串导致存储顺序颠倒,或者是截取子串时索引计算错误(比如搞反了substring的起止参数)。可以对照上面的索引处理逻辑检查你的代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:31:39