回文数
代码实现
回文数是指一个像16961这样"对称"的数,即:将这个数的数字按相反的顺序重新排列后,所得到的数和原来的数一样。 了解回文数 自然就能更好地理解回文链表
核心思路:
先找到中间节点
然后从中间节点开始 ,对后半段逆置
最后前半段和后半段进行比较 (从链表的头节点和逆转后返回的节点分别开始遍历判断)
如果相等就是回文结构 如果不相等 就不是回文结构
如果是奇数 ,节点就是中间
如果有两个中间结点,则返回第二个中间结点(偶数的情况)
需要注意一个细节 : 此时节点 2的next依然保存的是原链表节点 3的地址
class PalindromeList {
public:
struct ListNode* middleNode(struct ListNode* head)
{
struct ListNode* cur = head;
int size = 1;
//得到链表元素个数
while (cur->next != NULL)
{
size++;
cur = cur->next;
}
//第二次遍历 得到中间节点
cur = head;
int k = 0;
size /= 2; //5/2 =2
while (k < size)
{
k++;
cur = cur->next;
}
return cur;
}
// 反转链表函数
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode* cur = head;
struct ListNode* newhead = NULL;
if (head == NULL) //空链表
{
return NULL;
}
// 不是空链表
while (cur)
{
struct ListNode* next = cur->next; //保存下一个节点的地址
//头插
cur->next = newhead;
newhead = cur;
cur = next;
}
return newhead;
}
bool chkPalindrome(struct ListNode* head) //判断回文链表
{
// 找中间节点
struct ListNode* mid = middleNode(head);
// 从中间节点开始反转链表
struct ListNode* rhead = reverseList(mid);
// 判断
while (head && rhead)
{
if (head->val != rhead->val)
{
return false;
}
rhead = rhead->next;
head = head->next;
}
return true;
}
};
如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!!