Java链表递归统计元素出现次数始终返回0问题求助
问题排查与修复方案
先帮你梳理下代码里导致递归统计始终返回0的几个关键问题,以及对应的修复方法:
1. 递归方法的核心逻辑错误
你写的count方法里有两个致命问题:
- 误用了未定义的变量
temp,应该用参数传入的head节点来判断; - 递归调用时没有累加结果,只是单纯调用
count(temp.next,key),但没有把递归返回的次数加到当前计数里,导致每次递归都只返回当前节点的匹配次数(0或1),无法累计整个链表的总次数。
修正后的count方法应该是这样的:
public static int count(Node head, int key) { // 递归终止条件:链表为空,返回0 if (head == null) { return 0; } // 当前节点匹配则加1,再加上后续链表的匹配次数 int currentMatch = head.value == key ? 1 : 0; return currentMatch + count(head.next, key); }
2. 方法的静态性不匹配
你的count方法是非静态方法,但main是静态方法,直接在main里调用count(head,key)会编译报错(除非创建pal类的实例,但这里完全没必要)。所以要把count方法改成静态方法,加上static修饰符。
3. 局部变量遮蔽类静态变量(潜在隐患)
main方法里你定义了局部的Node head = null;,而类本身已经有一个静态的head变量,这会导致局部变量遮蔽了类的静态变量。虽然你的addToTheLast方法用的是类的静态head,链表构建是正常的,但这种写法很容易混淆,建议移除局部的head变量,直接使用类的静态head:
修改main里的链表构建部分:
public static void main(String[] args) { int no ; // 移除局部的head定义,直接使用类的静态head Scanner sc = new Scanner(System.in); System.out.print("Enter Number of Element "); no = sc.nextInt(); for(int i = 0 ;i< no; i ++){ System.out.print("Enter Element "); int a = sc.nextInt(); addToTheLast(new Node(a)); // 这里不需要单独判断head是否为空,addToTheLast方法已经处理了 } printList(); System.out.print("Enter search key"); int key = sc.nextInt(); int yo = count(head,key); System.out.print(String.valueOf(yo)); }
完整修正后的代码
import java.util.Scanner; public class pal{ private static Node head; private static class Node { private int value; private Node next; Node(int value) { this.value = value; } } public static void addToTheLast(Node node) { if (head == null) { head = node; } else { Node temp = head; while (temp.next != null) temp = temp.next; temp.next = node; } } public static void printList() { Node temp = head; while (temp != null) { System.out.format("%d ", temp.value); temp = temp.next; } System.out.println(); } public static void main(String[] args) { int no ; Scanner sc = new Scanner(System.in); System.out.print("Enter Number of Element "); no = sc.nextInt(); for(int i = 0 ;i< no; i ++){ System.out.print("Enter Element "); int a = sc.nextInt(); addToTheLast(new Node(a)); } printList(); System.out.print("Enter search key: "); int key = sc.nextInt(); int yo = count(head,key); System.out.println("Count of " + key + " is: " + yo); } public static int count (Node head,int key){ if(head == null){ return 0; } int current = head.value == key ? 1 : 0; return current + count(head.next, key); } }
这样修改后,递归统计元素出现次数的功能就能正常工作啦。
内容的提问来源于stack exchange,提问作者Vivek Modi
相关产品推荐
相关产品推荐

