/*
编写一个函数,检查输入的链表是否是回文的。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
来源:力扣(LeetCode)。
*/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
struct ListNode {
int val;
struct ListNode *next;
};
void listInit(struct ListNode* nodes, int* vals, int len);
void listPrint(struct ListNode* head, char* msg);
//1
//1,1
//1,2,1
//1,2,3,2,1
//1,2,3,3,2,1
bool isPalindrome(struct ListNode* head){
struct ListNode *leftNode = head, *rightNode = head, *midNode = NULL, *tmpNode = NULL;
int tmpVal = 0;
bool even = false;
//题目用例脑残
if(!head){
return true;
}
//节点遍历
while(1){
//检查是否已遍历完
if (!rightNode->next) {
//只有一个元素,直接返回
if (leftNode == head) {
return true;
}
even = false;
break;
} else if (!rightNode->next->next) {
//只有两个元素,直接比较
if (leftNode == head) {
if (leftNode->val == leftNode->next->val) {
return true;
}else{
return false;
}
}
even = true;
break;
}
//右边前进2步
rightNode = rightNode->next->next;
//左边前进1步,并且排序
if (leftNode == head) { //第一个节点断开
leftNode = leftNode->next;
head->next = NULL;
}
tmpNode = leftNode->next;
leftNode->next = head;
head = leftNode;
leftNode = tmpNode;
}
//处理之后,重新定左右节点的位置
rightNode = leftNode;
if(!even) {
leftNode = head->next;
}else{
leftNode = head;
}
//listPrint(leftNode, "left:");
//listPrint(rightNode, "right:");
//比较左右两边
while (leftNode && rightNode) {
//printf("left:%d,right:%d\r\n",leftNode->val,rightNode->val);
if (leftNode->val != rightNode->val){
return false;
}
leftNode = leftNode->next;
rightNode = rightNode->next;
}
return true;
}
void listInit(struct ListNode* nodes, int* vals, int len){
int i = 0;
for (i = 0; i < len; i++) {
nodes[i].val = vals[i];
nodes[i].next = &nodes[i+1];
}
nodes[len - 1].next = NULL;
}
void listPrint(struct ListNode* head, char* msg){
struct ListNode* node = head;
printf("%s:", msg);
while(node) {
printf("%5d ", node->val);
node = node->next;
}
printf("\r\n");
}
int main() {
int vals[]={1,2,2,1,3};
struct ListNode nodes[128] = {0};
listInit(nodes, vals, sizeof(vals) / sizeof(int));
listPrint(nodes, "list:");
printf("result:%d\r\n",isPalindrome(nodes));
}
回文链表
最新推荐文章于 2024-08-25 22:05:10 发布