且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

careercup-链表 2.7

更新时间:2022-08-22 08:46:13

2.7 编写一个函数,检查链表是否为回文。

思路:1)可以利用链表中的元素采用头插法创建一个新的链表,然后比较两个链表的元素是否相等。

     2)利用快慢指针,将链表后半部分逆转之后,比较前半部分与后半部分是否相等。

   3)利用栈将链表中的元素保存,然后弹出与链表中元素比较。

C++实现代码:

#include<iostream>
#include<new>
using namespace std;

struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x):val(x),next(NULL) {}
};

void createList(ListNode *&L)
{
    int arr[10]= {1,2,3,4,5,5,4,3,2,1};
    int i;
    ListNode *p=NULL;
    for(i=0; i<10; i++)
    {
        ListNode *tmp=new ListNode(arr[i]);
        if(L==NULL)
        {
            L=tmp;
            p=tmp;
        }
        else
        {
            p->next=tmp;
            p=tmp;
        }
    }
}

bool isPalindrome(ListNode *L)
{
    if(L==NULL)
        return true;
    ListNode *L2=NULL;
    ListNode *p=L;
    ListNode *q=NULL;
    ListNode *tmp=NULL;
    while(p)
    {
        tmp=new ListNode(p->val);
        if(L2==NULL)
        {
            L2=tmp;
        }
        else
        {
            tmp->next=L2;
            L2=tmp;
        }
        p=p->next;
    }
    p=L;
    q=L2;
    while(p&&q)
    {
        if(p->val!=q->val)
            return false;
        p=p->next;
        q=q->next;
    }
    if(p==NULL&&q==NULL)
        return true;
    else
        return false;
}

int main()
{
    ListNode *head=NULL;
    createList(head);
    ListNode *p=head;
    while(p)
    {
        cout<<p->val<<" ";
        p=p->next;
    }
    cout<<endl;
    cout<<isPalindrome(head)<<endl;
}