回文链表
回文链表
链表结点、栈性质、(回文数组首尾性质)
- 创建一个栈,从头接收链表的元素
- 栈顶元素和链表头结点进行比较(同时出栈,链表向后访问)
- 对比中一旦发现不等返回false
方法一
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//单纯用栈,然后用栈顶和链表元素做对比
bool isPalindrome(struct ListNode* head) {
int* stack = (int*)malloc(sizeof(int) * 100000);//为栈开辟空间
int top = 0;
//将head链表中的元素从头到尾依次赋值给tmp
struct ListNode* tmp = head;
while(tmp)
{
stack[top++] = tmp->val;
tmp = tmp->next;
}
//一个从栈顶出发,一个从链表头指针出发
while(top--)
{
if(stack[top] != head->val)
{
return false;
}
head = head->next;
}
free(stack);//释放内存
return true;
}
方法二
也可以选择用 判断数组首尾是否相等
这里我们拿stack来当做数组,判断首尾。时间复杂度会小一些
bool isPalindrome(struct ListNode* head) {
int* stack = (int*)malloc(sizeof(int) * 100000);
int top = 0;
//这里可以不用创建tmp
while(head)
{
stack[top++] = head->val;
head = head->next;
}
//数组首尾判断法
int low = 0;
int high = top - 1;//尾
while(low < high)
{
if(stack[low] != stack[high])
return false;
high--;
low++;
}
free(stack);
return true;
}
- 方法一,while中的top是每调用一次top就–,而不是等到循环结束了top才-- (top也表示栈长类似数组长,while循环第一次进行时,top就变成 栈长-1,在循环中,即栈长-1参与运算,没有越界现象)
- 方法一,创建临时变量tmp,是因为两个循环都要从链表头指针出发(头指针向后容易,向前难)