首先这个题目,lz用的是vs来测试的,创建链表的时候 链表的头节点是不存放数据,数据从第一个节点开始存放,所以在VS上面测试的时候是没有问题的,但是放到网站上就会出现访问越界的问题,所以下边儿我会贴出VS的代码以及网站上提交通过的代码,供大家参阅;
本题目需要考虑的问题还有:
1.输入的是一个空链表的时候怎么解决;
2.输入只有一个val域的时候该怎么解决;
3.最关键的是怎么判断是否是回文;
网站上提交的代码如下:
bool isPalindrome(struct ListNode* head) {
bool flag = 0;
struct ListNode *tmp, *reHead, *mid;
if (head == NULL)//空链表
{
return true;
}
if(head->next==NULL)//一个节点的链表
return true;
reHead = head->next;
tmp = head->next;
while (reHead->next != NULL&&reHead->next->next != NULL)
{
tmp = tmp->next;
reHead = reHead->next->next;
}
mid = tmp;//原来链表的中间
struct ListNode *reFirst = tmp;
struct ListNode *current = reFirst->next, *curNext;
reFirst->next = NULL;
while (current != NULL)
{
curNext = current->next;//先保存下次遍历的节点
current->next = mid;//后面的一个节点指向前面的节点
mid = current;//往后移
current = curNext;
}
while (mid != NULL)
{
if (head->val != mid->val)
return false;
mid = mid->next;
head = head->next;
}
return true;
}
以下是我VS上测试的代码
bool isPalindrome(struct plindromNode* head) {
bool flag = 0;
struct plindromNode *p, *pTmp;
struct plindromNode *reP, *rePtmp, *tmp, *reHead, *mid;
if (head->next == NULL)
{
return true;
}
if (head->next->next == NULL)
{
return true;
}
#if 0
while (p->next != NULL)
{
num[i++] = p->next->data;
p = p->next;
len++;
}
for (i = 0; i < len; i++)
{
number = num[i] * pow(10, len - 1 - i) + number;
}
for (int j = len - 1; j >= 0; j--)
{
reNumber = num[j] * pow(10, j) + reNumber;
}
if (number == reNumber)
{
flag = 1;
}
#endif
#if 0
//反转链表
reP = head;
rePtmp = head->next;
head->next = NULL;
while (rePtmp)
{
tmp = rePtmp->next;
rePtmp->next = reP;
reP = rePtmp;
rePtmp = tmp;
}
head = reP;
#endif
#if 1
reHead = head->next;
tmp = head->next;
while (reHead->next != NULL&&reHead->next->next != NULL)
{
tmp = tmp->next;
reHead = reHead->next->next;
}
mid = tmp;//原来链表的中间
struct plindromNode *reFirst = tmp;
struct plindromNode *current = reFirst->next, *curNext;
reFirst->next = NULL;
while (current != NULL)
{
curNext = current->next;//先保存下次遍历的节点
current->next = mid;//后面的一个节点指向前面的节点
mid = current;//往后移
current = curNext;
}
while (mid != NULL)
{
if (head->next->data != mid->data)
return false;
mid = mid->next;
head = head->next;
}
#endif
return true;
}
测试写的main函数
struct plindromNode *pTmp, *p, *head;
int num = 1;
int comNum = num;
int tmp = num;
int lenNum = 0;
int i = 0;
head = (struct plindromNode*)malloc(sizeof(struct plindromNode));
//head->data = 1;
p = head;
if (num == 0)
{
lenNum = 1;
while (lenNum)
{
pTmp = p;//循环的开始,先让p和pTmp同时指向第一个节点
p = (struct plindromNode*)malloc(sizeof(struct plindromNode));
p->data = num;
pTmp->next = p;//让p做为下一个节点
lenNum--;
}
}
else
{
while (tmp != 0)//计算输入的数字的位数
{
tmp /= 10;
lenNum++;
}
while (num != 0)
{
pTmp = p;//循环的开始,先让p和pTmp同时指向第一个节点
p = (struct plindromNode*)malloc(sizeof(struct plindromNode));
p->data = num / pow(10, lenNum - 1 - i);
num = num - p->data * pow(10, lenNum - 1 - i);
i++;
pTmp->next = p;//让p做为下一个节点
}
}
p->next = NULL;//将尾节点置NULL,否则成为野指针,无法访问
p = head;//把建好的链表的头指针赋给p来打印
bool flag = isPalindrome(head);
printf("%d\n", flag);
while (p->next != NULL)
{
printf("%d ", p->next->data);
p = p->next;
}
return 0;