大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞????吗,感谢❤️
目录
- 方法1. 直接在原链表上移除
- 方法2
点击查看题目
方法1. 直接在原链表上移除
思路:
因为要返回新的头结点,所以定义变量newhead;如果cur->val==val,那么要将cur前面的节点的next指向cur的后一个节点,所以定义变量prev代表cur的前一个节点
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode* cur=head;
struct ListNode* newhead=NULL;
struct ListNode* prev=NULL;
while(cur)
{
if(cur->val!=val)
{
if(prev==NULL)
{
newhead=prev=cur;
cur=cur->next;
}
else
{
prev=cur;
cur=cur->next;
}
}
else
{
struct ListNode* next=cur->next;
free(cur);
if(prev)
prev->next=next;
cur=next;
}
}
return newhead;
}
方法2
用tail去链接新的链表
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode* cur=head;
struct ListNode* newhead=NULL;
struct ListNode* tail=NULL;
while(cur)
{
if(cur->val==val)
{
struct ListNode* next=cur->next;
free(cur);
cur=next;
}
else
{
if(tail)
{
tail->next=cur;
tail=tail->next;
}
else
{
newhead=tail=cur;
}
cur=cur->next;
}
}
if(tail!=NULL)
tail->next=NULL;
return newhead;
}
好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞????吗,感谢看到这里,我们下篇博客见❤️