【每日刷题】Day7
🥕个人主页:开敲🍉
🔥所属专栏:每日刷题🍍
🌼文章目录🌼
[1. 206. 反转链表 - 力扣(LeetCode)](#1. 206. 反转链表 - 力扣(LeetCode))
[2. 203. 移除链表元素 - 力扣(LeetCode)](#2. 203. 移除链表元素 - 力扣(LeetCode))
[3. 876. 链表的中间结点 - 力扣(LeetCode)](#3. 876. 链表的中间结点 - 力扣(LeetCode))
1. 206. 反转链表 - 力扣(LeetCode)
//思路:三指针解法。指针pf1开始指向NULL,指针pf2开始指向头节点,指针pf3指向pf2中的next节点,三个同时往后遍历,当pf2走到NULL时,pf1就是要返回的头节点
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode* pf1 = NULL;
struct ListNode* pf2 = head;
while(pf2)
{
struct ListNode* pf3 = pf2->next;
pf2->next = pf1;
pf1 = pf2;
pf2 = pf3;
}
return pf1;
}
2. 203. 移除链表元素 - 力扣(LeetCode)
//思路:遍历。使用指针pf1放头节点,遍历链表,如果pf1->->val等于题目所给val,则直接将当前next指向next->next,跳过val所在节点
//需要注意的是,需要考虑链表中的val都是题目所给val已经空链表的情况
struct ListNode* removeElements(struct ListNode* head, int val)
{
while(head!=NULL&&(head->val)==val)
{
head = head->next;
}
if(!head)
{
return head;
}
struct ListNode* pf1 = head;
while(pf1->next)
{
if((pf1->next->val)==val)
{
pf1->next = pf1->next->next;
}
else
{
pf1 = pf1->next;
}
}
return head;
}
3. 876. 链表的中间结点 - 力扣(LeetCode)
//思路:快慢指针算法,这种寻找中间点的算法题使用快慢指针会非常便捷高效。主要思路就是指针pf1每次走一个节点,指针pf2每次走两个节点,当pf2走到末节点或走出链表时,pf1所指向的就是需要返回的中间节点。
struct ListNode* middleNode(struct ListNode* head)
{
struct ListNode* pf1 = head;
struct ListNode* pf2 = head;
while(pf2&&pf2->next)
{
pf2 = pf2->next->next;
pf1 = pf1->next;
}
return pf1;
}