LeetCode.234. 回文链表
234. 回文链表
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
输入:head = [1,2]
输出:false
解题思路:
先找到链表的中间节点,然后反转中间节点之后的部分,最后比较原链表前半部分和反转后的后半部分是否相同。
middleNode
函数:使用快慢指针法找到链表的中间节点。快指针每次移动两步,慢指针每次移动一步,当快指针到达链表末尾时,慢指针刚好指向中间节点。reverseList
函数:通过迭代的方式反转链表。使用三个指针cur
、next
和rhead
来实现节点的反转。isPalindrome
函数:- 调用
middleNode
函数找到链表的中间节点。 - 调用
reverseList
函数反转中间节点之后的部分。 - 比较原链表前半部分和反转后的后半部分是否相同。
- 调用
struct ListNode* middleNode(struct ListNode* head){
struct ListNode* slow = head,* fast = head;
while(fast && fast->next){
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* cur = head;
struct ListNode* rhead = NULL;
while(cur){
struct ListNode* next= cur->next;
cur->next = rhead;
rhead = cur;
cur = next;
}
return rhead;
}
bool isPalindrome(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;
}