leetcode oj讲解(第203题)
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1 输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[ ]
思路一:找到要删除的节点,直接下手删除
思路一的代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode*pcur = head;
struct ListNode*prev = NULL;
while(pcur)
{
if(pcur->val!=val)
{
prev=pcur;
pcur=pcur->next;
}
else
{
struct ListNode*next=pcur->next;
pcur=next;
if(prev)
{
prev->next=next;
}
else
{
head=pcur;
}
}
}
return head;
}
思路二:找到不需要删除的节点,使其形成一条新链表(只需要改变next),注意最后是否还有节点
思路二代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode*cur = head,*newtail = NULL,*newhead=NULL;
if(head==NULL)
return head;
while(cur)
{
if(cur->val!=val)
{
if(newhead == NULL)//新链表空,为头节点
{
newtail= newhead = cur;
}
else
{//新链表不为空
newtail->next=cur;
newtail = newtail->next;
}
}
cur=cur->next;
}
if(newtail)//防止尾巴后有值为val的节点
{
newtail->next=NULL;
}
return newhead;
}
leetcode oj讲解(第876题)
给你单链表的头结点 head
,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:
输入:head = [1,2,3,4,5] 输出:[3,4,5] 解释:链表只有一个中间结点,值为 3 。
示例 2:
输入:head = [1,2,3,4,5,6] 输出:[4,5,6] 解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。
思路:使用快慢指针法(注意判断停下来的条件)
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* middleNode(struct ListNode* head)
{
if(head->next==NULL||head==NULL)
return head;
//快慢指针
struct ListNode*slow = head,*fast = head;
//注意是且
while(fast!=NULL&&fast->next!=NULL)
{
slow=slow->next;
fast=fast->next;
if(fast)
fast=fast->next;
}
return slow;
}
这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助❤
欢迎各位点赞,收藏和关注哦❤
如果有疑问或有不同见解,欢迎在评论区留言哦❤
后续我会一直分享双一流211西北大学软件(C,数据结构,C++,Linux,MySQL)的学习干货以及重要代码的分享