题目
Palindrome Linked List
Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
标签
Linked List、Two Pointers
难度
简单
分析
题目意思是判断一个链表是否是回文结构。做法是先拿到链表的中间元素,然后逆序后面一段的链表,最后比较前段和后段的链表。
C代码实现
struct ListNode* linked_list_find_mid_ele(struct ListNode* head)
{
struct ListNode* fast, *slow;
fast = head;
slow = head;
if(!head)
return NULL;
while(fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode* t;
struct ListNode* p, * q;
if(!head || !head->next)
return head;
p = head;
q = head->next;
while(q)
{
t = q->next;
q->next = p;
p = q;
q = t;
}
head->next = NULL;
head = p;
return head;
}
bool isPalindrome(struct ListNode* head)
{
struct ListNode * midNode;
struct ListNode *leftList, *rightList;
if(!head || !head->next)
return true;
leftList = head;
midNode = linked_list_find_mid_ele(head);
rightList = reverseList(midNode);
while(leftList && rightList)
{
if(leftList->val != rightList->val)
return false;
leftList = leftList->next;
rightList = rightList->next;
}
return true;
}