单链表面试题一
Posted 雨轩(小宇)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表面试题一相关的知识,希望对你有一定的参考价值。
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
方法一
思路:将值不等于val的结点重新链接成一条新链表
struct ListNode* removeElements(struct ListNode* head, int val){
//为空,返回NULL
if(head==NULL)
return NULL;
//创建一个新链表,将不是val的结点链接在一起
struct ListNode* newhead=NULL,*tail=NULL;
struct ListNode* cur=head;
while(cur)
{
struct ListNode* next=cur->next;//迭代
if(cur->val==val)
{
free(cur);
}
else
{
if(tail==NULL)
{
newhead=tail=cur;//让newhead成为头指针
}
else
{
tail->next=cur;
tail=cur;
}
}
cur=next;
}
//这里要注意,有可能最后一个结点不是需要删除的,那么next需要置空
if(tail)
tail->next=NULL;
return newhead;
}
图解:
方法二
思路:创建一个哑结点(附加头结点),修改指针指向:p->next = p->next->next;删除值为val的结点
struct ListNode* removeElements(struct ListNode* head, int val){
if(head==NULL)
return head;
struct ListNode*phead=malloc(sizeof(struct ListNode));
phead->next=head;
struct ListNode*p=phead;
//p->next进行遍历,设置哑结点,有可能删除头结点,从头开始进行遍历
while(p->next!=NULL)
{
if(p->next->val==val)
{
p->next=p->next->next;//删除val结点
}
else
{
p=p->next;
}
}
struct ListNode* cur = phead->next;//记得用cur结点替换,
free(phead);//释放开辟的phead
return cur;
}
ps:创作不意,记得三连
以上是关于单链表面试题一的主要内容,如果未能解决你的问题,请参考以下文章