目录
一、链表的中间结点
题目介绍:
思路分析:
代码实现(思路2):
struct ListNode* middleNode(struct ListNode* head){
struct ListNode*slow=head,*fast=head;//定义快指针fast,慢指针slow
while(fast && fast->next)//结束条件
{
slow=slow->next;
fast=fast->next->next;
}
return slow;//返回慢指针
}
二、反转链表
题目介绍:
思路分析:
代码实现:
struct ListNode* reverseList(struct ListNode* head){
struct ListNode*n1=NULL,*n2,*n3;//定义指针n1、n2、n3
if(head==NULL)//链表为空时不需要反转,直接返回
{
return head;
}
n2=head;
n3=head->next;
while(n3)//指针n3不等于空时循环进行
{
n2->next=n1;//指针反转
n1=n2;//迭代进行
n2=n3;//迭代进行
n3=n3->next;//迭代进行
}
n2->next=n1;//把最后一个结点链接上
return n2;//返回反转后的头结点
}
三、回文链表
题目介绍:
思路分析:
根据题目可知:此题重点在于找到链表的中间结点,并从中间结点开始反转其后的结点,得到的指针与头指针遍历比较,值全相等即为回文链表。图解过程如下:
代码实现:
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*n1=NULL,*n2,*n3;
if(head==NULL)
{
return head;
}
n2=head;
n3=head->next;
while(n3)
{
n2->next=n1;
n1=n2;
n2=n3;
n3=n3->next;
}
n2->next=n1;
return n2;
}
bool isPalindrome(struct ListNode* head){
struct ListNode* head1=head;
if(head==NULL)//所给链表为空直接返回true
{
return true;
}
//先找链表的中间结点
struct ListNode* mid1=middleNode(head);
//从中间结点处反转链表
struct ListNode* mid2=reverseList(mid1);
//遍历比较
while(mid2)
{
if(head1->val==mid2->val)
{
head1=head1->next;
mid2=mid2->next;
}
else
return false;
}
return true;
}
小结
本次刷题针对了单链表的增删查改基本操作以及对多指针的操作,掌握了如快慢指针、反转箭头等解法与思路。
本次总结到此结束,感谢各位的阅读。欢迎大家指正错误,也欢迎初学者一起来探讨知识~