Leetcode刷题---C语言实现初阶数据结构---单链表

这篇具有很好参考价值的文章主要介绍了Leetcode刷题---C语言实现初阶数据结构---单链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Leetcode刷题---C语言实现初阶数据结构---单链表,C语言/C++语言,C++/数据结构与算法,Leetcode刷题,leetcode,c语言,数据结构

1 删除链表中等于给定值 val 的所有节点

删除链表中等于给定值 val 的所有节点
给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点
Leetcode刷题---C语言实现初阶数据结构---单链表,C语言/C++语言,C++/数据结构与算法,Leetcode刷题,leetcode,c语言,数据结构
输入: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
输出:[ ]
思路如下
Leetcode刷题---C语言实现初阶数据结构---单链表,C语言/C++语言,C++/数据结构与算法,Leetcode刷题,leetcode,c语言,数据结构
见详细代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode*prev=NULL;
    struct ListNode*cur=head;
    while(cur)
    {
        if(cur->val==val)
        {
            if(cur==head)
            {
                head=cur->next;
                cur=head;
            }
            // head=cur->next;
            // cur=head;
            else
            {
                prev->next=cur->next;
                cur=prev->next;
            }
        }
        else
        {
            prev=cur;
            cur=cur->next;
        }
        // else
        // {
        //     prev->next=cur->next;
        //     cur=prev->next;
        // }
    }
    return head;
}

上述注释掉的代码是我在写的时候犯的错误,大家也可以试着自己写写看会不会和我犯同样的错误
如果有其他思路可以随意发表意见!

2 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点

给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点
给你单链表的头结点head ,请你找出并返回链表的中间结点
如果有两个中间结点,则返回第二个中间结点
Leetcode刷题---C语言实现初阶数据结构---单链表,C语言/C++语言,C++/数据结构与算法,Leetcode刷题,leetcode,c语言,数据结构
输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为3
Leetcode刷题---C语言实现初阶数据结构---单链表,C语言/C++语言,C++/数据结构与算法,Leetcode刷题,leetcode,c语言,数据结构
输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为3和4,返回第二个结点
思路
大部分人呢第一个想到的就是先去遍历一遍链表计算出链表的长度—然后再次遍历一遍链表找到链表的的中间结点
但是如果是在面试的时候面试官让你只能遍历一次那你应该怎么处理呢?
这里运用的是快慢指针的相对速度
这时候我们可以考虑用快慢指针来作答
Leetcode刷题---C语言实现初阶数据结构---单链表,C语言/C++语言,C++/数据结构与算法,Leetcode刷题,leetcode,c语言,数据结构
fast走两步,slow走一步,刚好天时地利人和走到了中间结点的位置
详细代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* middleNode(struct ListNode* head){
    struct ListNode*slow=head;
    struct ListNode*fast=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
    }
    return slow;
}

3 输入一个链表,输出该链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点
描述
输入一个链表,输出该链表中倒数第k个结点
示例1
输入:1,{1,2,3,4,5}
返回值:{5}
Leetcode刷题---C语言实现初阶数据结构---单链表,C语言/C++语言,C++/数据结构与算法,Leetcode刷题,leetcode,c语言,数据结构
思路一致
这里运用的快慢指针的相对距离
解法一

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
   struct ListNode* cur=pListHead;
   int count=0;//建立一个计数器
   if(pListHead==NULL)//如果链表为空,则返回空指针
   {
    return NULL;
   }
   while(cur)//循环遍历链表,求出链表的长度
   {
    cur=cur->next;
    count++;
   }
   if(k>0&&k<=count)//对k值的合理性进行判断
   {
    int pos=count-k;//求出循环的次数
   while(pos)
   {
    pListHead=pListHead->next;
    pos--;
   }
   return pListHead;//找到就返回目标结点
   }
   return NULL;
}

解法二

//计数法 时间复杂度:0(n) 空间:O(1)
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) 
{
    // write code here
    if(pListHead == NULL || pListHead->next == NULL)
    //若链表没有结点或只有一个结点时返回(第二条件不必须)
    {
        return pListHead;
    }
    int nodenums = 0;//记录总结点数(第一次遍历)
    int returnnums = 0;//第二次遍历(每经过一次结点,前置+1)用于排查K结点
    struct ListNode* cur = pListHead;
    while(cur != NULL)//计数遍历
    {
        nodenums++;
        cur = cur->next;
    }
     if(k>nodenums)//如果k>总结点数,则代表不存在这一结点,返回空
    {
        return NULL;
    }
    struct ListNode* pwe = pListHead;
    while(pwe != NULL)//第二次遍历,寻找倒数K点
    {
        ++returnnums;//每经过一个结点就+1
         if(nodenums-returnnums < k)
        //如果结点总数减去当前结点数小于K,那么这个结点就是倒数K结点;
        {
            break;
        }
        pwe = pwe->next;
    }
    return pwe;
}

4 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
Leetcode刷题---C语言实现初阶数据结构---单链表,C语言/C++语言,C++/数据结构与算法,Leetcode刷题,leetcode,c语言,数据结构
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [ ], l2 = [ ]
输出:[ ]
示例 3:
输入:l1 = [ ], l2 = [0]
输出:[0]
思路
Leetcode刷题---C语言实现初阶数据结构---单链表,C语言/C++语言,C++/数据结构与算法,Leetcode刷题,leetcode,c语言,数据结构
Leetcode刷题---C语言实现初阶数据结构---单链表,C语言/C++语言,C++/数据结构与算法,Leetcode刷题,leetcode,c语言,数据结构
本质上是结构体指针的地址和成员变量next的相互赋值,这里也涉及到了链表的尾插,直接套用就可以了,前提是掌握好了链表的增删查改基本逻辑
代码演示文章来源地址https://www.toymoban.com/news/detail-618269.html

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
    if(list1==NULL)
    {
        return list2;
    }
    else if(list2==NULL)
    {
        return list1;
    }
    //定义一个head和tail
    //head和tail最初都置为NULL
    //tail=tail->next
    //尾部插入
    struct ListNode*head=NULL;
    struct ListNode*tail=NULL;
    while(list1&&list2)
    {
        //取小的尾部插入
        if(list1->val<list2->val)
        {
            if(tail==NULL)
            {
                head=tail=list1;
                //tail=tail->next;
            }
            else
            {
                tail->next=list1;
                tail=tail->next;
            }
            list1=list1->next;   
        }
        else
        {
            if(tail==NULL)
            {
                head=tail=list2;
            }
            else
            {
                tail->next=list2;
                tail=tail->next;
            }
            list2=list2->next; 
        }
    }
    if(list1)
    {
        tail->next=list1;
    }
    else if(list2)
    {
        tail->next=list2;
    }
    return head;
}

到了这里,关于Leetcode刷题---C语言实现初阶数据结构---单链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构初阶之基础二叉树(C语言实现)

    📃 博客主页: 小镇敲码人 💞 热门专栏:数据结构与算法 🚀 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌏 任尔江湖满血骨,我自踏雪寻梅香。 万千浮云遮碧月,独傲天下百坚强。 男儿应有龙腾志,盖世一意转洪荒。 莫使此生无痕度,终归人间一捧黄。🍎🍎🍎 ❤️ 什么

    2024年03月19日
    浏览(43)
  • 【数据结构初阶】六、线性表中的队列(C语言 -- 链式结构实现队列)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】五、线性表中的栈(C语言 -- 顺序表实现栈)_高高的胖子的博客-CSDN博客  

    2024年02月08日
    浏览(43)
  • 【数据结构初阶】二、 线性表里的顺序表(C语言实现顺序表)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】一. 复杂度讲解_高高的胖子的博客-CSDN博客  =======================================

    2024年02月08日
    浏览(44)
  • 『初阶数据结构 • C语言』⑩ - 栈的概念与实现(附完整源码)

        栈存储数据的方式跟数组一样,都是将元素排成一行。只不过它还有以下 3 条约束。   ● 只能在末尾插入数据。   ● 只能读取末尾的数据。   ● 只能移除末尾的数据。 你可以将栈看成一叠碟子:你只能看到最顶端那只碟子的碟面,其他都看不到。另外,要加碟子只能

    2024年02月16日
    浏览(51)
  • 『初阶数据结构 • C语言』⑩ - 队列的概念与实现(附完整源码)

        队列对于临时数据的处理也十分有趣,它跟栈一样都是有约束条件的数组(或者链表)。区别在于我们想要按什么顺序去处理数据,而这个顺序当然是要取决于具体的应用场景。 你可以将队列想象成是电影院排队。排在最前面的人会最先离队进入影院。套用到队列上,就

    2024年02月15日
    浏览(43)
  • 『初阶数据结构 • C语言』⑫ - 堆的概念&&实现(图文详解+完整源码)

    目录 0.写在前面 1.什么是堆? 2.堆的实现 2.1 堆的结构定义 2.2 函数声明 2.3 函数实现 2.3.1 AdjustUp(向上调整算法) 2.3.2 AdjustDown(向下调整算法) 2.3.3 HeapCreate(如何建堆) 2.3.4 建堆的时间复杂度 3. 完整源码 Heap.h文件 Heap.c文件  Test.c文件  上一章中介绍了树和二叉树的概念

    2024年02月16日
    浏览(47)
  • 【数据结构初阶】七、非线性表里的二叉树(堆的实现 -- C语言顺序结构)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】六、线性表中的队列(链式结构实现队列)-CSDN博客  ===========================

    2024年02月08日
    浏览(45)
  • 【数据结构初阶】五、线性表中的栈(C语言 -- 顺序表实现栈)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】四、线性表里的链表(带头+双向+循环 链表 -- C语言实现)_高高的胖子的博客

    2024年02月08日
    浏览(45)
  • 【数据结构初阶】四、线性表里的链表(带头+双向+循环 链表 -- C语言实现)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】三、 线性表里的链表(无头+单向+非循环链表 -- C语言实现)-CSDN博客  ====

    2024年02月08日
    浏览(45)
  • 【数据结构初阶】八、非线性表里的二叉树(二叉树的实现 -- C语言链式结构)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】七、非线性表里的二叉树(堆的实现 -- C语言顺序结构)-CSDN博客  ==========

    2024年02月08日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包