饭不食,水不饮,题必须刷
C语言免费动漫教程,和我一起打卡! 《光天化日学C语言》
LeetCode 太难?先看简单题! 《C语言入门100例》
数据结构难?不存在的! 《画解数据结构》
LeetCode 太简单?算法学起来! 《夜深人静写算法》
给你一个链表,判断是否为回文链表。
样例输入:1 -> 2 -> 2 -> 1
样例输出:true
bool isPalindrome(struct ListNode* head){
}
( 1 ) (1) (1) LeetCode 234. 回文链表
( 2 ) (2) (2) 剑指 Offer II 027. 回文链表
( 3 ) (3) (3) 面试题 02.06. 回文链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/************************************* 栈的顺序表实现 *************************************/
#define DataType int
#define maxn 100010
struct Stack {
DataType data[maxn];
int top;
}gStk;
void StackClear(struct Stack* stk) {
stk->top = 0;
}
void StackPushStack(struct Stack *stk, DataType dt) {
stk->data[ stk->top++ ] = dt;
}
void StackPopStack(struct Stack* stk) {
--stk->top;
}
DataType StackGetTop(struct Stack* stk) {
return stk->data[ stk->top - 1 ];
}
int StackGetSize(struct Stack* stk) {
return stk->top;
}
bool StackIsEmpty(struct Stack* stk) {
return !StackGetSize(stk);
}
/************************************* 栈的顺序表实现 *************************************/
int ListGetSize(struct ListNode* head) { // 获取链表的长度
int len = 0;
if(!head) {
return 0;
}
while(head) {
head = head->next;
++len;
}
return len;
}
bool isPalindrome(struct ListNode* head){
int len = ListGetSize(head); // (1)
if(len == 0) {
return true; // (2)
}
int cnt = 0;
StackClear(&gStk);
while( cnt < len/2 ) {
StackPushStack(&gStk, head->val); // (3)
head = head->next;
++cnt;
}
if(len & 1) {
head = head->next; // (4)
}
while(head) {
if( StackGetTop(&gStk) == head->val) {
StackPopStack(&gStk); // (5)
}else {
return false;
}
head = head->next;
}
return true;
}
false
,直到遍历完毕后返回true
。涉及到和逆序有关的问题,都可以想想怎么用 栈 来解决。