234回文链表的实现 利用栈解决

目录

题目

解析

代码实现

执行结果


 力扣 234题

题目

        给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 

解析

回文链表是什么?

  • 第i个数与倒数第i个数的值相等

题解:

  • 将所有数据入栈,入栈后获取栈顶的值并出栈,栈顶的值与数组的值一个个对比(就相当于用比较数组的第i个和倒数第i个,倒数的顺序就是出栈的顺序),如果有不相等的就证明不是回文链表

  •  题目要求数据范围是[1,10^5],可以定义栈的大小为100001。取值范围在0-9,可以定义char类型的栈,char类型的是int类型的4倍,节约内存空间,但也可以写成整型栈int

top的初值:

  • 定义top=0时,先入栈然后+1即top++,出栈时top-1指向的就是栈顶位置,--top出栈
  • 定义top=-1时,top+1然后入栈即++top,出栈时top指向的就是栈顶,top--出栈

注意:

力扣内没有头结点,常用头节点解题的可添加一个结点:

struct ListNode node;//定义指针程序要崩溃 是野指针,因此定义局部变量,程序结束,自己就释放内存了
node.next=head;//普通节点,没加指针 " . "进行访问

代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool isPalindrome(struct ListNode* head){
    char arr[100001];
    int top=0;//栈顶指针
    struct ListNode* p;
    //入栈
    for(p=head;p!=NULL;p=p->next)
    {
        arr[top++]=p->val;
    }
    //出栈
    for(p=head;p!=NULL;p=p->next)
    {
        if(p->val!=arr[--top])
            return false;
    }
    return true;
}

执行结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值