检查所有值是否在链表中至少重复两次

Check if all values are repeated at least two times in linked list

本文关键字:两次 是否 链表 检查      更新时间:2023-10-16

我有完全相同的ElemList类定义在http://www.cplusplus.com/forum/beginner/73928/

你能建议一些技巧如何写一个函数,返回true的情况下,所有的值已经重复两次或更多次?例如

1,1,1,2,2 - true
1,2 - false

我觉得它肯定需要一个动态数组,但想不出算法

是的,制作一个std::map<int,int>,其中计算列表中每个数字的出现次数。此计算需要遍历整个列表。

之后,对刚刚创建的std::map进行另一次传递,并找出是否所有的值都大于或等于2。

bool twoormore()
    {
        int count = 0;// for counting elements in list
        int temp;// temprorary element for sorting and logical part
        int cik;// how much times the value has been mentioned
        bool res = true;// function result
        int * arr;// pointer for the upcoming dynamic array
        for(start();!end();next())
        {
            count++;// counting the elements
        }
        if(count != 0){
            arr = new int[count];//creating array
            int i = 0;
            for(start();!end();next())
            {
                arr[i++] = current->num;//filling array
            }
            /** array sorting **/
            for(int i = 0;i < count;i++)
                for(int j = 0; j < count; j++)
                {
                    if(arr[j] > arr[i])
                    {
                        temp = arr[i];
                        arr[i] = arr[j];
                        arr[j] = temp;
                    }
                }
            /** sort ends **/
            temp = arr[0]; // setting first element ar temp.. for upcoming check
            cik = 1;// it's been its first time
            for(int i = 1;i < count;i++)
            {
                if(arr[i] == temp)
                {
                    cik++; continue;// if upciming element is equal to temprorary , then add 1 to counter.. and continue looping
                }else
                {
                    if(cik > 1)
                    {
                        temp = arr[i];// if everything ok, but element value changes.
                        cik = 1;// sets defualt
                        continue;
                    }
                    else
                    {
                        res = false;// other way, the value wasnt there two times
                        break;
                    }
                }

            }
            delete arr;//deleting allocated space for array
            return res;// returning bool, true or false.
        }
    }

函数将看起来像这样(未经测试):

  std::map<int,int> m_mapCount;
  std::map<int,int>::iterator m_Iterator;
  for (l.start(); !l.end(); l.next()) // put the content of your linkedlist to map
  {
       m_mapCount[l.current->num] += 1;
  }
  for (m_Iterator=m_mapCount.begin(); m_Iterator!=m_mapCount.end(); m_Iterator++)
  {
      if(m_Iterator->second >= 2) return true;
  }
相关文章: