以下是我为解决特定问题而编写的代码。但是我遇到了解决两个边缘情况的问题。第一个元素本身是元音的情况,以及最后一个元素是元音的情况。现在至于第一个边缘情况,我认为可以通过遍历列表直到找到元音,并在所述节点之前插入头节点并更新头指针来解决。但在第二种情况下,最后一个元素是元音的情况,在这种情况下,我的代码运行到一个无限循环。我该如何处理这种特殊情况?此外,如果您可以建议任何不同的方法来解决问题,请执行此操作,如果可以,请建议我可以在代码中应用任何改进。
#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);
}
答案 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)
...
vowels
和consonants
数组。vowels
数组中的字母覆盖链表中的数据,然后使用辅音数组覆盖。时间复杂度:O(N)