🎉🎉🎉欢迎莅临我的博客空间,我是池央,一个对C++和数据结构怀有无限热忱的探索者。🙌
🌸🌸🌸这里是我分享C/C++编程、数据结构应用的乐园✨
🎈🎈🎈期待与你一同在编程的海洋中遨游,探索未知的技术奥秘💞
📝专栏指路:
📘【C++】专栏:深入解析C++的奥秘,分享编程技巧与实践。
📘【数据结构】专栏:探索数据结构的魅力,助你提升编程能力。
链表的回文结构
温馨小提示:点击即可做题
题目:
画图分析:
题目思路分析:
1.先找出中间节点
链表的中间节点(点击即可做题)找中间节点力扣上直接有这个题目,我们以此来分析思路
解决思路:快慢指针
快指针走两步,慢指针走一步
奇数个节点快指针的next指针为空时,慢指针刚好走到链表的中间节点
偶数个节点快指针为空时,慢指针刚好走到链表的中间节点
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {
//创建快慢指针,快指针走两步,慢指针走一步
ListNode*fast,*slow;
fast=head;
slow=head;
while(fast&&fast->next)//不可以换位置,在链表节点偶数个结束循环是fast==NULL,
//交换位置会对空指针解引用
{
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
2.反转链表
反转链表(点击即可做题)找中间节点力扣上直接有这个题目,我们以此来分析思路
解决思路:迭代
假设链表为 1→2→3→∅我们想要把它改成 ∅←1←2←3
我们需要定义三个指针
一个指针初始化为空
一个指针指向原链表的头结点
一个指针指向原链表头结点的next指针指向的节点
代码实现
struct ListNode*reverse(struct ListNode*head)
{
if(head==nullptr||head->next==nullptr)//只有一个节点或链表为空
{
return head;
}
struct ListNode*n1,*n2,*n3;
n1=nullptr;
n2=head;
n3=n2->next;//保存当前节点的next指针
while(n2)
{
n2->next=n1;//当前节点的next指针指向前一个节点
n1=n2;
n2=n3;
if(n3)//n3最先为空此时n2还没有为空没有出循环,不能对空指针n3解引用
n3=n3->next;
}
return n1;
};
最后我们来实现一下
链表回文结构的代码
// typedef struct ListNode ListNode;
// struct ListNode {
// int val;
// struct ListNode* next;
// ListNode(int x) : val(x), next(NULL) {}
// };
//寻找中间节点,快慢指针
struct ListNode*middleNode(struct ListNode*head)
{
struct ListNode*fast,*slow;
fast=head;
slow=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
}
return slow;
};
//翻转链表
struct ListNode*reverse(struct ListNode*head)
{
if(head==nullptr||head->next==nullptr)//只有一个节点或链表为空
{
return head;
}
struct ListNode*n1,*n2,*n3;
n1=nullptr;
n2=head;
n3=n2->next;
while(n2)
{
n2->next=n1;
n1=n2;
n2=n3;
if(n3)//n3最先为空此时n2还没有为空没有出循环,不能对空指针n3解引用
n3=n3->next;
}
return n1;
};
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
struct ListNode*mid=middleNode(A);
struct ListNode*rmid=reverse(mid);
while(A&&rmid)
{
if(A->val!=rmid->val)
{
return false;
}
A=A->next;
rmid=rmid->next;
}
return true;
}
};
持续更新中...
敬请期待