题目
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针head,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
链接:链表的回文结构_牛客题霸_牛客网 (nowcoder.com)
题解
先找到链表的中间结点,然后将链表的后半段进行逆置,再依次比较链表的前半段和后半段,如果相同则返回true,如果不同则返回false。
寻找链表中间节点具体分析力扣206. 反转链表_啊哈leelee~的博客-CSDN博客
链表逆置具体分析力扣206. 反转链表_啊哈leelee~的博客-CSDN博客
代码如下:
//寻找中间结点(快慢指针) 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; } //链表原地逆置(类似头插法) struct ListNode* reverseList(struct ListNode* head) { struct ListNode* newhead = NULL; struct ListNode* next = head; struct ListNode* cur = head; while (cur) { next = next->next; cur->next = newhead; newhead = cur; cur = next; } return newhead; } //牛客网链表回文结构 bool chkPalindrome(struct ListNode* head) { struct ListNode* mid = middleNode(head); struct ListNode* rmid = reverseList(mid); while (rmid) { if (rmid->val != head->val) return false; else { rmid = rmid->next; head = head->next; } } return true; }