检查链表是否是回文

时间:2015-06-03 12:07:46

标签: c++ list palindrome

我正在编写一个程序来检查单链表是否是回文。我正在使用通过迭代进行逆转的概念。

我已经在链表中插入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();
}

4 个答案:

答案 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;
    }

}