一、链表的中间结点
这种题目有一个非常标准的解题方法,设两个快慢指针,都指向头结点让快指针一次走两个结点,慢指针一次走一个结点,这样,快指针遍历完之后,慢指针就会到达中间结点了。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* middleNode(struct ListNode* head)
{
struct ListNode* fast=head,*slow=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
}
return slow;
}
二、回文链表
回文链表这个题目,综合了很多题目,十分考验综合性,主要思路:
- 找到链表的中间结点。
- 从中间结点开始,对后面的链表进行反转。反转链表问题解决思路
- 比较新旧链表的数据。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool isPalindrome(struct ListNode* head)
{
struct ListNode* fast=head,*slow=head;
struct ListNode* p1,*p2,*p3;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
}
p1=NULL,p2=slow,p3=p2->next;
while(p2)
{
p2->next=p1;
p1=p2;
p2=p3;
if(p3)
{
p3=p3->next;
}
}
while(p1)
{
if(p1->val!=head->val)
{
return false;
}
head=head->next;
p1=p1->next;
}
return true;
}