对链表的进一步理解(由判断链表是否是回文的错误想法引起的思考)

        可能只有我会傻傻地理解错,哈哈,还好及时纠正了!
        在判断一个链表是否是回文时,我简单地以为只要把链表反转然后比较反转前后的值是否相同即可,但是忘了链表操作的只是头指针,存储的也只是头指针,不是整个链表!!!当使用指针实现链表反转后,每个节点的指针域已经发生变化,无法再得到原始的链表。下面是我错误的答案,以及测试过程和小的涉及的知识点。

#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。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值