链表的回文结构
1°题目链接
2°思路
找到中间结点
返回中间结点
再逆置
逆置后返回新的头结点
新的头结点就是链表的头结点
最后相当于这两个链表同时从头开始遍历
只有有一个数不一样
就不是回文结构
每个值都一样
就是回文结构
比如1 2 3 4
先找到3
返回3
然后逆置
4 3
再把1 2和4 3从头开始遍历进行数字的比较
中间结点:
数据结构与算法 OJ练习专栏第8篇文章
逆置:
数据结构与算法 OJ练习专栏第7篇文章
3°实现
//逆置
struct ListNode* reverseList(struct ListNode* head)
{
if (head == NULL)
return NULL;
struct ListNode* newhead = NULL;
struct ListNode* cur = head;
struct ListNode* next = head->next;
while (cur)
{
cur->next = newhead;
newhead = cur;
cur = next;
if (next)
next = cur->next;
}
return newhead;
}
//找中间结点
struct ListNode* middleNode(struct ListNode* head)
{
struct ListNode* slow = head;
struct ListNode* fast = head;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
bool chkPalindrome(struct ListNode* A)
{
//找到中间节点
struct ListNode* mid = middleNode(A);
//从中间节点开始逆置 返回头指针 rHead为逆置后的头指针
struct ListNode* rHead = reverseList(mid);
struct ListNode* curA = A;
struct ListNode* curR = rHead;
while (curA && curR)
{
//比较val 相等就往后走
if (curA->val != curR->val)
{
return false;
}
else
{
curA = curA->next;
curR = curR->next;
}
}
return true;
}
4°运行结果
#12链表的回文结构#完