如何拼接栈中字符值并修改returnItems方法返回逆序字符序列
问题核心错误分析
你原有代码存在三个核心问题:
- 用
T类型的value变量做拼接容器,泛型直接做字符串拼接本身就有类型转换隐患,而且每次循环你都把value重新赋值为当前节点的字符,之前拼接的内容会直接被覆盖 - 你原有标注的拼接行把
temp.getLink()(下一个节点对象)直接拼进了结果,根本拿不到下一个节点存储的字符值 - 循环终止条件逻辑有问题,当遍历到最后一个节点时,
temp.getInfo()是有效值,但原有逻辑处理不完整
修改方案
方案1:调整返回值为String(推荐,适配你判断回文的使用场景)
你需要的就是拼接后的字符串做对比,不需要保留泛型返回,修改后代码如下:
public String returnItems() { Node<T> temp = top; // 用StringBuilder做拼接容器,避免字符串常量池冗余 StringBuilder sb = new StringBuilder(); if (top == null) { System.out.println("Stack is empty"); return ""; } System.out.println("Elements: "); while (temp != null) { // 直接把当前节点存储的字符拼进去 sb.append(temp.getInfo()); // 遍历到下一个节点 temp = temp.getLink(); } return sb.toString(); }
如果abcdef依次入栈,这个方法返回的就是你要的fedcba,直接和原字符串对比就能判断是否为回文。
方案2:保留原方法泛型返回值T的修改方式
如果不能改方法返回值定义,就修改拼接逻辑,最后强转为T:
public T returnItems() { Node<T> temp = top; StringBuilder sb = new StringBuilder(); if (top == null) { System.out.println("Stack is empty"); return null; } System.out.println("Elements: "); while (temp != null) { sb.append(temp.getInfo()); temp = temp.getLink(); } // 强转为泛型T,仅当你业务中T可以兼容字符串类型时可用 return (T) sb.toString(); }
核心修改点说明
- 删掉了你标注的错误拼接行,改用StringBuilder来累计所有节点的字符
- 修正了循环逻辑,不需要单独判断下一个节点是否为空,只要当前节点不为空就处理,简化代码
- 去掉了每次循环覆盖value的错误逻辑,所有字符依次追加到拼接容器里
内容的提问来源于stack exchange,提问作者user15082428
相关产品推荐
相关产品推荐

