Palindrome Linked List
Given a singly linked list, determine if it is a palindrome.
ollow up:
Could you do it in O(n) time and O(1) space?
//本题可以采用暴力解决测办法,这需要使用一个额外的栈,则时间空间复杂度均为O(n)
//本处采用的思路为:首先找到链表的中间点,然后将中间点后的半段链表进行逆转,然后将前半段单链表以及后半段单链表从头到尾进行遍历,
//进行素的比较
bool isPalindrome(ListNode* head) {
if(NULL == head || NULL == head->next)
{
return true;
}
ListNode* middle = getListMid(head);
ListNode* headTwo = reverseList(middle);
while(head && headTwo)
{
if(head->val != headTwo->val)
{
return false;
}
head = head->next;
headTwo = headTwo->next;
}
return true;
}
ListNode* getListMid(ListNode* head)
{
if(NULL == head || NULL == head->next)
{
return head;
}
ListNode* slow = head;
ListNode* fast = head;
ListNode* preslow = head;
while(fast)
{
fast = fast->next;
if(fast)
{
fast = fast->next;
preslow = slow;
slow = slow->next;
}
}
preslow->next = NULL;
return slow;
}
ListNode* reverseList(ListNode* head)
{
if(NULL == head || NULL == head->next)
{
return head;
}
ListNode* finalList = NULL;
while(head)
{
ListNode* temp = (ListNode*)malloc(sizeof(ListNode));
temp->val = head->val;
temp->next = finalList;
finalList = temp;
head = head->next;
}
return finalList;
}