判断一条单向链表是不是“回文”

本文介绍了一种使用链表和栈来判断链表是否为回文的方法。通过遍历链表后半部分并将其元素压入栈中,再与前半部分进行对比,实现了高效的回文检测。

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

用到之前的C实现链表

http://blog.youkuaiyun.com/edwards_june/article/details/54380468

int isPalindrome(LNode *s, int n) {	//n是长度
	if (0 > n) {
		return 0;
	} else {
		LNode *node = s;
		int index = n / 2 + (n % 2 == 0 ? 0 : 1);
		int i = index + 1;
		Type data;
		StackLink *p = (StackLink*) malloc(sizeof(StackLink));
		initStack(p);
		for (; i <= n; i++) {
			if ((data = get(&node, i)) != NULL) {
				push(p, data);
			}
		}
		int length = getStackLength(p);
		ElemType elem;
		while (length-- > 0) {
			pop(p, &elem);
			if (node->data != elem) {
				return 0;
			}
			node = node->next;
		}
		return 1;
	}
}


### 数据结构与算法——链表入门 链表是一种常见的线性数据结构,其特点是通过指针连接各个节点形成一条逻辑上的链条。相比于数组,链表的优点在于动态分配内存以及插入删除操作的时间复杂度较低[^4]。 #### 单链表基础 单链表是最简单的链表形式,其中每个节点包含两部分:数据域和指向下一个节点的指针。如果需要遍历整个链表,则可以从头节点依次访问到尾节点。需要注意的是,单链表不支持随机访问,因此查找特定元素可能需要 O(n) 的时间复杂度[^2]。 #### 循环链表特性 循环链表是另一种特殊类型的链表,它的最后一个节点不再指向 `null`,而是重新链接回到头部或其他指定位置。这种设计使得某些场景下可以更方便地处理边界情况,例如约瑟夫环问题或者模拟队列等应用场合。 #### 判断回文链表 对于给定的一个单向链表来说,要检测它是否构成回文序列可以通过快慢指针法找到中间点并反转后半部分来完成比较工作;当然也可以借助栈辅助实现这一功能[^3]。 以下是基于Python语言编写的简单版本用于验证上述理论: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def isPalindrome(head: ListNode) -> bool: if not head or not head.next: return True slow = fast = head stack = [] while fast and fast.next: stack.append(slow.val) slow = slow.next fast = fast.next.next # 如果长度为奇数则跳过中心结点 if fast: slow = slow.next while slow: top = stack.pop() if top != slow.val: return False slow = slow.next return True ``` 此代码片段展示了如何利用堆栈原理配合双指针技巧高效解决判定回文性质的任务。 --- ### 动态规划简介及其应用场景 当面对较为复杂的优化类题目时,采用动态规划策略往往能够有效降低计算量。例如排列组合过程中遇到重复子串的情况可通过设置过滤机制避免冗余运算发生[^5]。 ```python from typing import List def permuteUnique(nums: List[int]) -> List[List[int]]: nums.sort() # 排序以便于后续剪枝操作 res = [] path = [] used = set() def backtrack(): if len(path) == len(nums): res.append(list(path)) return for i in range(len(nums)): if i in used or (i>0 and nums[i]==nums[i-1] and i-1 not in used): continue used.add(i) path.append(nums[i]) backtrack() path.pop() used.remove(i) backtrack() return res ``` 上面的例子说明了即使存在相同数值的情况下仍然能生成无重叠的不同全排列方案集。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值