【发布时间】:2015-07-18 09:19:55
【问题描述】:
链表可以用以下结构表示:-
struct Node { char data; struct Node* next; }; struct Node { char data; struct Node* next; };class Node { public char data; public Node next; }class Node { public char data; public Node next; }给你一个函数,
struct Node* ReArrangeVowelsAndConsonants(struct Node* head);struct Node* ReArrangeVowelsAndConsonants(struct Node* head);static Node ReArrangeVowelsAndConsonants(Node head);static Node ReArrangeVowelsAndConsonants(Node head);指针“head”指向链表的开头。实现函数重新排列并返回相同的列表,使所有元音占据列表的前半部分,所有辅音占据后半部分。
注意:
- 不要创建新列表,修改现有列表。
- 元音和辅音的相对顺序不应相互改变。
- 您可以假设列表的长度是偶数,并且一半节点包含元音,另一半包含辅音。
- 如果列表为 NULL,则返回 NULL。
例子:
输入:
a -> k -> r -> i -> t -> e -> o -> m输出:
a ->i -> e -> o -> k -> r -> t -> m说明:
前半部分的辅音 k 和 r 移到后半部分,后半部分的元音 e 和 o 移到前半部分,保持相对顺序不变。
我的代码正确执行操作,但不满足注释中的第 2 点。当我用元音交换辅音时,我的输出中元素的相对顺序会发生变化。我的代码在下面....我只需要如何使我的代码也适用于这种情况。
import java.io.*;
import java.lang.*;
import java.util.*;
public class Node
{
public char data;
public Node next;
public static Node rearrange(Node head)
{
Node start=new Node();
Node curr=new Node();
Node temp=new Node();
start=curr=head;
int begin=0;
int flag=0;
while(head.next!=null)
{
if(head.data=='a'||head.data=='e'||head.data=='i'||head.data=='o'||head.data=='u')
{ // no change
}
else
{
curr=head.next;
do
{
System.out.println("CURR "+curr.data+" HEAD "+head.data);
if(curr.data=='a'||curr.data=='e'||curr.data=='i'||curr.data=='o'||curr.data=='u')
{
temp.data=curr.data;
curr.data=head.data;
head.data=temp.data;
break;
}
}while((curr=curr.next)!=null);
}
head=head.next;
}
while(start.next!=null)
{
System.out.print(start.data+"->");
start=start.next;
}
System.out.print(start.data);
return start;
}
public static void main(String args[])
{
Scanner s=new Scanner(System.in);
int count=0;
System.out.println("Enter the number of characters:");
int length=s.nextInt();
System.out.println("Enter the character seperated by ->");
String inp=s.next();
StringTokenizer st=new StringTokenizer(inp,"->");
Node[] a=new Node[inp.length()];
for(int i=0;st.hasMoreElements();i++)
{
a[i]=new Node();
a[i].data=(st.nextToken().toString()).charAt(0);
count++;
}
a[count-1].next=null;
for(int i=0;i<(count-1);i++)
{
a[i].next=a[i+1];
}
Node start =new Node();
start=rearrange(a[0]);
}
}
【问题讨论】:
-
问题定义有点不完整:当第一个元素是辅音时会发生什么?如果我们应该返回相同的头部,那么我们需要进行内容替换。但是如果返回一个不同的节点作为头部是可以的,我们可以有一个基于重新链接的解决方案。
-
其实是在一次编码测试中出现的。我们只需要在函数中编写逻辑并返回head即可。我们可以只用另一个改变头部数据。正如您在“其他”条件“交换”中看到的那样,我在我的代码中做到了这一点。如果第一个元素是辅音并且我们在后面的字符串中有元音,我们需要将这些元音带到第一个。如果我们力求找到任何元音,我们可以返回头部。是澄清了还是??
-
考虑输入:r->m->o->p->q->g->a 预期输出:o->a->r->m->p->q ->g 我的程序输出:o->a->r->p->q->g->m 这会产生问题,相对顺序会发生变化,我们需要得到 r->m->p- >q->g 但我得到 r->p->q->g->m
-
但我的意思是,如果允许您返回不同的节点作为头部,那么重新链接而不是内容交换可能会更容易。问题是这是否允许。
-
你是说,如果我们可以使用:temp=curr;当前=头;头=温度;对?? @RealSkeptic
标签: java list data-structures linked-list