在单一链接列表的末尾移动元音

时间:2013-07-15 17:34:53

标签: c++ linked-list

以下是我为解决特定问题而编写的代码。但是我遇到了解决两个边缘情况的问题。第一个元素本身是元音的情况,以及最后一个元素是元音的情况。现在至于第一个边缘情况,我认为可以通过遍历列表直到找到元音,并在所述节点之前插入头节点并更新头指针来解决。但在第二种情况下,最后一个元素是元音的情况,在这种情况下,我的代码运行到一个无限循环。我该如何处理这种特殊情况?此外,如果您可以建议任何不同的方法来解决问题,请执行此操作,如果可以,请建议我可以在代码中应用任何改进。

#include<iostream>

using namespace std;

struct node
{
    char ch;
    node *next;
};

void enqueue (node **head, node **tail, char val)
{
    node *newn = (node *)malloc(sizeof(node));
    newn->ch = val;
    newn->next = NULL;

    if (*head == NULL)
    {
        *head = newn;
        *tail = newn;
    }

    (*tail)->next = newn;
    (*tail) = newn;

}

void print (node *head)
{
    while (head!=NULL)
    {
        cout<<head->ch<<" ";
        head = head->next;
    }
    cout<<endl;
}

bool isVowel (char ch)
{
    ch = ch | 32;

    if (ch == 'a' || ch =='e' || ch=='i' || ch=='o' || ch=='u')
        return true;
    return false;

}



node* segregateVowels (node *head, node *tail)
{
    if (head == NULL)
        return head;

    node *temp = head;
    node *fin = tail;

    while (temp!=fin)
    {
        cout<<temp->ch<<" "<<fin->ch<<endl;
        getchar();
        if (isVowel(temp->next->ch))
        {
            node *shift = temp->next;
            temp->next = temp->next->next;
            tail->next = shift;
            shift->next = NULL;
            tail = shift;
        }
        else
            temp = temp->next;

    }
    return head;

}


int main()
{
    srand(time(NULL));

    node *head = NULL, *tail = NULL;

    int i = 20;

    while (i>=0)
    {
        enqueue (&head, &tail, rand()%26+65);
        i--;
    }

    print(head);


    head = segregateVowels (head, tail);


    print(head);
}

1 个答案:

答案 0 :(得分:1)

要处理最后一个元素是元音的第二个边缘情况: 替换

while (temp!=fin)

while (temp->next!=fin)

事实上,您无需检查fin的数据。如果它是一个元音,那么它已经被隔离到了最后。如果它的辅音它也满足条件。无论哪种方式,它都不会影响结果。当然,当大小为1时,您需要处理其他一些情况。

处理第一个边缘案例很简单。

写一个小的if条件,检查头节点中的元音,并在while循环开始之前相应地更新指针。你完成了!

我有另一个简单的方法: 假设它是双重链表...

取两个指针head(指向列表的开头)和tail(指向列表的末尾)。现在尝试理解以下代码:

int head_count=1, tail_count=linked_list_size;
while(head_count<tail_count)
{
     while(!isvowel(head->data) && head_count<=linked_list_size)
     {
         head=head->next;
         head_count++;
     }
     while(isvowel(tail->data) && tail_count>0)
     {
          tail=tail->prev;
          tail_count--;
      }
     if(tail_count>head_count)
     {//swap the values..
          char tmpc = head->data;
          head->data = tail->data;
          tail->data = head->data;
     } 
 }

时间复杂度:O(N) 空间复杂度:O(1)

另一种使用额外空间O(N) ...

的方法
  • 创建两个数组.. vowelsconsonants数组。
  • 将链表解析到最后,并将所有字母存储到各自的数组中。
  • 现在首先使用vowels数组中的字母覆盖链表中的数据,然后使用辅音数组覆盖。

时间复杂度:O(N)