您的位置:首页 > 编程语言 > C语言/C++

[C语言][LeetCode][234]Palindrome Linked List

2016-04-14 21:30 344 查看

题目

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 leetcode