目录
力扣 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;
}