单链表面试题一

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:创作不意,记得三连

以上是关于单链表面试题一的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法:单链表面试题(新浪,百度,腾讯)

Java 数据结构——单链表面试题

c/c++单链表面试题—链表带环问题

单链表面试题一

c/c++单链表面试题—链表相交问题

数据结构 Java 版玩转链表链表面试题及个人题解