Java - 计算链接列表中的出现次数

时间:2015-09-12 19:26:41

标签: java eclipse linked-list repeat counting

作为作业的一部分,我必须编写一个方法,在链表中打印重复值,以及它们出现的次数。以下是使用辅助方法printRepeats()的方法countRepeats(ListNode node)

问题是我的方法的输出一遍又一遍地打印重复值。例如,在值为1 1 1 2 3 4 5 6 7 6的列表中,输出为1 (Occurences = 3) 1 (Occurences = 3) 1 (Occurences = 3) 6 (Occurences = 2) 6 (Occurences = 2)。重复的任何值只应打印一次。有什么建议?提前谢谢!

public class LinkedList
{
    private ListNode first;

    public void printRepeats()
    {
        String ans = "";
        ListNode temp = first;
        while(temp != null)
        {
            if(countRepeats(temp) > 1 && ans.indexOf((int)temp.getValue()) == -1)
            {
                ans += temp.getValue();
                System.out.print(temp.getValue() + " (Occurences = " + countRepeats(temp) + ") ");
            }
            temp = temp.getNext();
        }
        if(ans.length() == 0)
            System.out.print("None of the elements repeat.");
    }

    private int countRepeats(ListNode node)
    {
        ListNode temp = first;
        int count = 0;
        while(temp != null)
        {
            if((int)temp.getValue() == (int)node.getValue())
                count++;
            temp = temp.getNext();
        }
        return count;
    }
}   

2 个答案:

答案 0 :(得分:0)

考虑到您不能使用除LinkedList之外的任何其他数据结构,您可以:

  • 创建另一个ListNode元素作为名为" repeatedElements"的列表的第一个元素,该元素必须包含此元素的对元素/重复。
  • 在计算单个元素的重复次数时,插入元素及其重复次数" repeatedElements"列表。
  • 在计算元素的重复次数之前,请扫描元素的repeatedElements列表。如果元素存在,请勿打印输出。如果不是,请照常重复您的代码。

我描述的系统将包含比特定要求更多的信息(存储每个元素的重复次数),但可能会再次需要它。

答案 1 :(得分:0)

为了计算出现次数,您需要维护访问节点的跟踪记录,就像您已经计算了任何节点一样,则不需要再次选择链接列表中的那些节点。下面的程序清楚地解释了这一点-

import java.util.ArrayList;

public class CustomLinkList {

    public static void main(String[] args) {
        ListNode linkedList = new ListNode(15);
        linkedList.next =new ListNode(67);
        linkedList.next.next =new ListNode(15);
        linkedList.next.next.next =new ListNode(65);
        linkedList.next.next.next.next =new ListNode(13);
        linkedList.next.next.next.next.next =new ListNode(98);
        linkedList.next.next.next.next.next.next =new ListNode(33);
        linkedList.next.next.next.next.next.next.next =new ListNode(29);
        linkedList.next.next.next.next.next.next.next.next =new ListNode(15);
        ListNode printList = linkedList;
        System.out.println("Custom Link List is ::: ");
        while (printList.next != null){
            System.out.printf("%d ",printList.info);
            printList = printList.next;
        }
        System.out.println();
         CustomLinkList.occurancesOfElement(linkedList);
    }

    public static void occurancesOfElement(ListNode listNode){
        ArrayList<Integer> visitedNode = new ArrayList();
        while(listNode !=null){
            ListNode node = listNode;
            int count = 0;
            while (node !=null)
            {
                if(listNode.info == node.info && !visitedNode.contains(node.info)) {
                    count++;
                }
                node = node.next;
            }
            if(!visitedNode.contains(listNode.info))
            System.out.println("Occurences of : "+listNode.info+" is "+ count);
            
            visitedNode.add(listNode.info);
            listNode = listNode.next;
        }
    }
}

class ListNode {
    int info;
    ListNode next;
    ListNode(int info){
        this.info = info;
        next = null;
    }
}

class DoublyListNode {
    int info;
    DoublyListNode previous;
    DoublyListNode next;
}
}