LeetCode之234. Palindrome Linked List

本文介绍了一种使用链表实现回文检测的方法。通过将链表分为前后两部分,并反转后半部分进行比较,以此判断整个链表是否构成回文。文章提供了两种不同环境下实现的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先这个题目,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;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值