大家好,我是安然无虞。
文章目录
- 每篇前言
- 面试题:回文链表
- 解题思路
- 遇见安然遇见你,不负代码不负卿。
每篇前言
作者:安然无虞
作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请铁汁批评斧正。
种一棵树最好的时间是十年前,其次是现在。 各位,共勉。
面试题:回文链表
原题链接:回文链表 题目描述:
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。
示例:
1->2->2->1
返回:true
解题思路
之所以讲解前面两题,实际上都是为这道题准备的,本题的解题步骤是:
- 找出链表的中间位置;
- 逆置后半段
- 最后从头依次比较即可
代码执行:
//回文链表
class PalindromeList {
public:
//判断中间结点
struct ListNode* middleNode(struct ListNode* A)
{
struct ListNode* slow = A, *fast = A;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
//反转后半部分
struct ListNode* reverseAfter(struct ListNode* mid)
{
struct ListNode* newHead = NULL, *cur = mid;
while(cur)
{
struct ListNode* next = cur->next;
cur->next = newHead;
newHead = cur;
cur = next;
}
return newHead;
}
bool chkPalindrome(ListNode* A)
{
// write code here
//先判断中间结点
struct ListNode* mid = middleNode(A);
//再反转后半部分
struct ListNode* rHead = reverseAfter(mid);
while(A && rHead)
{
if(A->val != rHead->val)
{
return false;
}
else
{
A = A->next;
rHead = rHead->next;
}
}
return true;
}
};
完整代码:
遇见安然遇见你,不负代码不负卿。
码字不易,求个三连 抱拳了兄弟们。