可能只有我会傻傻地理解错,哈哈,还好及时纠正了!
在判断一个链表是否是回文时,我简单地以为只要把链表反转然后比较反转前后的值是否相同即可,但是忘了链表操作的只是头指针,存储的也只是头指针,不是整个链表!!!当使用指针实现链表反转后,每个节点的指针域已经发生变化,无法再得到原始的链表。下面是我错误的答案,以及测试过程和小的涉及的知识点。
#include <iostream>
using namespace std;
struct ListNode
{
int val;
struct ListNode *next;
};
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(head == NULL || head->next==NULL) return true;
ListNode *he=head;//这里只是头结点的赋值,不是整个链表的存储
ListNode *newhead=NULL;
while(head!=NULL)//he只是指向和最初头结点head指向的同一个内存空间,当改变空间中的存储内容时,he中指向的内容也改变
{
ListNode *li=head->next;
head->next=newhead;
newhead=head;
head=li;
}
/***作为测试程序,测试he中的元素是什么,输出查看***/
ListNode *pp=he;
while(pp)
{
cout<<pp->val<<endl;
pp=pp->next;
}
/**下面的程序相当于只判断了原链表首尾元素是否相同,不是想象中的两个链表比较
我不想说,之前更傻的操作是以为判断he==newhead就可以判断整个链表是否相同,,,,,
**/
ListNode * p = he;
ListNode * q = newhead;
while(p!=NULL && q!=NULL)
{
if(p->val == q->val)
{
p=p->next;
q=q->next;
}
else
return false;
}
return true;
}
};
int main()
{
struct ListNode *head;
struct ListNode *p,*q;
head=NULL;
int n;
while(cin>>n)//输入一串字符后,回车换行符也被存在缓冲区
{
p = (struct ListNode *) malloc(sizeof(struct ListNode));
p->val=n;
if (head == NULL)
head = p;
else
q->next = p;
q = p;
if(cin.get()=='\n')//判断缓冲区是否为回车符
break;
}
q->next=NULL;
Solution ss;
bool a=ss.isPalindrome(head);
cout<<a;
}
实例测试:
1.第一个元素和最后一个元素都是1,返回true.
2.第一个元素和最后一个元素都是2,返回true.
3.第一个元素是5,不同于反转后的第一个元素(原链表最后一个),返回false。