我正在编写一个程序来检查单链表是否是回文。我正在使用通过迭代进行逆转的概念。
我已经在链表中插入2,3,5,3,2并根据以下思想对其进行了反转:如果在倒车后获得的链表与倒车前相同,那么它就是回文。但是我无法用匹配声明来结束程序。我怎样才能匹配这两个清单?
这是我的代码:
struct Node{
int data;
Node* next;
};
Node*head;
void Insert(int x)
{
Node*temp=new Node();
temp->data=x;
temp->next=head;
head=temp;
}
void print()
{
Node*temp=head;
cout<<"list is";
while(temp!=NULL)
{
cout<<temp->data;
temp=temp->next;
}
}
void rec()
{
Node*current, *prev, *next;
current=head;
prev=NULL;
while(current!=NULL)
{
next= current->next;
current->next= prev;
prev= current;
current=next;
}
head=prev;
}
int main()
{
clrscr();
Node*head=NULL;
Insert(2);
Insert(3);
Insert(5);
Insert(3);
Insert(2);
cout<<"list before reversing is\n";
print();
cout<<"\n";
cout<<"list after reversing is \n";
rec();
print();
getch();
}
答案 0 :(得分:1)
代替单独的反转功能,具有检查回文的功能。在该函数中,反转列表并存储在临时列表中。 然后迭代并比较每个节点 - &gt;数据。如果所有匹配然后是它的回文,否则你会突破循环并设置为假。
答案 1 :(得分:1)
创建一个双链表(添加一个Node * prev)到列表的节点。 然后,迭代和比较迭代器就像这样:
bool isPalindrome(Node * head, Node * tail)
{
Node * inc = head, * dec = tail;
while (inc != nullptr && dec != nullptr)
{
if (inc->data != dec->data) return false;
inc = inc->next;
dec = dec->prev;
}
return inc == nullptr && dec == nullptr;
}
始终尝试使用最佳容器来完成任务。
答案 2 :(得分:0)
让它递归,并检查回来的路
#include <functional>
using namespace std;
struct Node
{
int data;
Node* next;
};
bool isPalin( Node* h )
{
function<bool(Node*)> ip_rec = [&](Node* p) -> bool
{
if(p)
{
if( ! ip_rec(p->next) ) return false;
if( p->data != h->data ) return false;
h=h->next;
}
return true;
};
return ip_rec(h);
}
答案 3 :(得分:0)
我在C ++中的解决方案.....非常简单,但不确定代码是否经过优化...
bool isPalindrome(Node *head)
{
int count=0;
Node *ptr, *nptr;
ptr=head;
while(ptr!=NULL)
{
count++;
ptr=ptr->next;
}
ptr=head;
int arr[count],count1=0;
while(ptr!=NULL)
{
// cout<<ptr->data;
arr[count1]=ptr->data;
count1++;
ptr=ptr->next;
}
ptr=head;
while(ptr!=NULL)
{
if(ptr->data!=arr[count-1])
return false;
ptr=ptr->next;
count--;
if(count==-1)
return true;
}
}