【数据结构练习】单链表OJ题(一)

这篇具有很好参考价值的文章主要介绍了【数据结构练习】单链表OJ题(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、移除链表元素

题目:
【数据结构练习】单链表OJ题(一),数据结构,c语言,开发语言

思路1:

在原来的链表上进行修改,节点的数据是val的删除,然后前后再连接起来。

需要考虑的因素:
1.要删除的节点位置在第一个节点;
2.要删除的节点位置在中间任意一个节点;
3.要删除的节点位置在最后一个节点

用一个变量cur遍历链表,要删除的节点是头节点,就是头删;是中间的某个节点就把要删除的节点free释放,然后连接前后的节点(定义另一个变量prev为cur的前一个);是最后一个节点,就是尾删,但是这里的尾删与中间某个节点删除是一样的。

struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode* cur=head;
    struct ListNode* prev=NULL;
    while(cur)
    {
        if(cur->val==val)
        {
            if(cur==head)
            {
                head=cur->next;
                free(cur);
                cur=head;
            }
            else
            {
                prev->next=cur->next;//cur是尾节点next就是空
                free(cur);
                cur=prev->next;
            }
        }
        else
        {
            prev=cur;
            cur=prev->next;
        }
    }
    return head;
}

思路2:

将不是要移除的元素连接到新的链表

这里我们要定义一个新的头指针(newhead),还要一个变量cur去遍历原链表,找不是要移除的元素;再定义一个变量tail使每次插入的新节点链接起来。

注意:在最后要把tail的next置空,因为尾节点的next必须指向空指针

struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode* cur = head;
    struct ListNode* newhead=NULL;
    struct ListNode* tail = newhead;
    while(cur)
    {
        if(cur->val==val)
        {
            cur=cur->next;
        }
        else
        {
            if(tail==NULL)
            {
                newhead=tail=cur;
            }
            else
            {
                tail->next=cur;
                tail=tail->next;
            }
            cur=cur->next;
        }
    }
    if(tail)
    {
        tail->next=NULL;
    }
    return newhead;
}

二、反转链表

题目:
【数据结构练习】单链表OJ题(一),数据结构,c语言,开发语言
采用头插法

定义一个新的头指针newhead指向NULL,用一个变量cur遍历原链表,再定义一个变量del为cur的下一个节点(这样cur循环一次可以到原来链表的下一个节点)。头插时,让cur的next指向newhead,再把newhead移到cur的位置上去,直到把原链表的所有节点头插完,返回的newhead就是原链表的反转。

【数据结构练习】单链表OJ题(一),数据结构,c语言,开发语言

struct ListNode* reverseList(struct ListNode* head)
{
    //头插
    struct ListNode* newhead=NULL;
    struct ListNode* cur=head;
    while(cur)
    {
       struct ListNode* del=cur->next;
       cur->next=newhead;
       newhead=cur;
       cur=del;
    }
    return newhead;
}

三、链表的中间节点

题目:
【数据结构练习】单链表OJ题(一),数据结构,c语言,开发语言
快慢指针法

定义两个指针变量fast(快指针)和slow(慢指针),快指针一次走两步,慢指针一次走一步。当快指针或者快指针的next有一个为空指针时,跳出循环,返回慢指针,就是中间节点。

【数据结构练习】单链表OJ题(一),数据结构,c语言,开发语言

struct ListNode* middleNode(struct ListNode* head)
{
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while(fast&&fast->next)
    {
        fast=fast->next->next;
        slow=slow->next;
    }
    return slow;
}

四、链表中倒数第k个节点

题目:
【数据结构练习】单链表OJ题(一),数据结构,c语言,开发语言
快慢指针相对距离法

定义两个指针变量fast和slow,先让fast走k步(如果fast已经为空k还没结束就返回空),然后fast和slow一起走(速度相同),当fast为空时跳出循环,此时的slow就是倒数第k个节点。

【数据结构练习】单链表OJ题(一),数据结构,c语言,开发语言

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
{
    struct ListNode* slow = pListHead;
    struct ListNode* fast = pListHead;
    while(k)//先走k步
    {
        if(fast==NULL)
        {
            return NULL;
        }
        fast=fast->next;
        k--;
    }
    while(fast!=NULL)//相对距离
    {
        fast=fast->next;
        slow=slow->next;
    }
    return slow;
}

五、回文结构

题目:
【数据结构练习】单链表OJ题(一),数据结构,c语言,开发语言
这道题其实是前面两个题的综合
采用找中间节点和反转链表,然后比较是否回文

先找到中间节点,然后在这个中间节点开始反转后面的节点,比较从头节点开始到中间节点的个数,如果相同,就是回文,返回true;否则返回false。

【数据结构练习】单链表OJ题(一),数据结构,c语言,开发语言

class PalindromeList {
public:
    ListNode* find(ListNode* head)
    {
        ListNode* slow=head;
        ListNode* fast=head;
        while(fast&&fast->next)
        {
            slow=slow->next;
            fast=fast->next->next;
        }
        return slow;
    }
    ListNode* reverse(ListNode* head)
    {
        ListNode* newhead=NULL;
        ListNode* cur=head;
        while(cur)
        {
            ListNode* del=cur->next;
            cur->next=newhead;
            newhead=cur;
            cur=del;
        }
        return newhead;
    }
    bool chkPalindrome(ListNode* head) {
        ListNode* rid=find(head);
        ListNode* mrid=reverse(rid);
        ListNode* cur=head;
        while(cur!=rid)
        {
            if(cur->val!=mrid->val)
            {
                return false;
            }
            cur=cur->next;
            mrid=mrid->next;
        }
        return true;
    }
};

六、合并两个有序链表

题目:
【数据结构练习】单链表OJ题(一),数据结构,c语言,开发语言
两个链表的节点从头开始比较,取小的尾插到新链表;如果有一个链表的节点还没尾插完,就直接将这个链表的剩余节点尾插到新链表去。

如果刚开始有某个链表为空,就直接返回另一个链表
【数据结构练习】单链表OJ题(一),数据结构,c语言,开发语言

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    if(list1==NULL)
    {
        return list2;
    }
    if(list2==NULL)
    {
        return list1;
    }
    struct ListNode* head=NULL;
    struct ListNode* tail=NULL;
    while(list1&&list2)
    {
        if(list1->val<=list2->val)
        {
            if(tail==NULL)
            {
                head=tail=list1;
            }
            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;
    }
    if(list2)
    {
        tail->next=list2;
    }
    return head;
}

【数据结构练习】单链表OJ题(一),数据结构,c语言,开发语言
感谢观看~文章来源地址https://www.toymoban.com/news/detail-674210.html

到了这里,关于【数据结构练习】单链表OJ题(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【数据结构】单链表OJ题

    🔥 博客主页: 小王又困了 📚 系列专栏: 数据结构 🌟 人之为学,不日近则日退  ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、移除链表元素 💡方法一: 💡方法二: 二、链表的中间节点 💡方法一: 三、链表中倒数第k个结点 💡方法一: 四、反转链表 💡方法一:

    2024年02月14日
    浏览(58)
  • 数据结构——单链表OJ题

    在前面的博客中我们知道了什么是单链表以及如何建立单链表! 现在让我们来检验一下学习成果吧! 提示:此博客中题目均来自牛客网以及力扣网!在题目中我会附带两大网站的链接,大家也可以去练习一下! 若有链接问题可以在评论区及时反馈! 题目链接: OJ链接 提示

    2024年02月14日
    浏览(82)
  • 【数据结构】单链表OJ题(一)

    🔥 博客主页: 小王又困了 📚 系列专栏: 数据结构 🌟 人之为学,不日近则日退  ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、移除链表元素 💡方法一: 💡方法二: 二、链表的中间节点 💡方法一: 三、链表中倒数第k个结点 💡方法一: 四、反转链表 💡方法一:

    2024年02月13日
    浏览(80)
  • 【数据结构】单链表OJ题(二)

    🔥 博客主页: 小王又困了 📚 系列专栏: 数据结构 🌟 人之为学,不日近则日退  ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、链表分割 💡方法一: 二、链表的回文 💡方法一:  三、相交链表 💡方法一:  四、环形链表  💡方法一:  🗒️前言: 在上一期中我们

    2024年02月14日
    浏览(40)
  • 数据结构——单链表OJ题(第二弹)

    此次练习题有两道! 有点小难度,但相信难不住大家的! 我也会给出两道OJ题的链接,大家也赶快去试一试吧 题目链接: OJ链接 提示: 链表中节点的数目范围在范围 [0, 104] 内 -105 = Node.val = 105 pos 的值为 -1 或者链表中的一个有效索引 本题有两个解析思路~ 代码演示: 提示:

    2024年02月14日
    浏览(40)
  • 【LeetCode】【数据结构】单链表OJ常见题型(二)

     👀 樊梓慕: 个人主页   🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言: 【LeetCode】面试题02.04. 分割链表 【LeetCode】160. 相交链表 【LeetCode】141. 环形链表 【LeetCode】142. 环形链表Ⅱ 方法

    2024年02月14日
    浏览(45)
  • 【LeetCode】【数据结构】单链表OJ常见题型(一)

     👀 樊梓慕: 个人主页   🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》 🌝 每一个不曾起舞的日子,都是对生命的辜负。 目录 前言: 【LeetCode】203.移除链表元素 【LeetCode】206.反转链表  思路一 思路二 【LeetCode】876.链表的中间结点 快慢指针法

    2024年02月14日
    浏览(37)
  • 【数据结构】移除链表元素-图文解析(单链表OJ题)

    LeetCode链接:203. 移除链表元素 - 力扣(LeetCode) 本文导航 💭做题思路 🎨画图更好理解: ✍️代码实现 🗂️分情况讨论: ❄️极端情况: 遍历链表,找到值为 val 的节点删除 这里需要两个指针  cur 用来遍历链表  prev 指向 cur 的前一个位置,方便删除一个节点后,链接前

    2024年02月14日
    浏览(35)
  • 【数据结构】反转链表、链表的中间节点、链表的回文结构(单链表OJ题)

    正如标题所说,本文会图文详细解析三道单链表OJ题,分别为:  反转链表 (简单)  链表的中间节点 (简单)  链表的回文结构 (较难) 把他们放在一起讲的原因是:  反转链表 和  链表的中间节点 是  链表的回文结构 的基础 为什么这样说?请往下看: 目录 1. 反转链

    2024年02月13日
    浏览(72)
  • 数据结构——二叉树(OJ练习)

    大家好,本期是二叉树的最后一期,这一期我们来看看二叉树的编程题 . - 力扣(LeetCode) 首先我们的思路是: 遍历二叉树,把每个节点去比较一次,按照要求返回 我们来看代码 . - 力扣(LeetCode) 这里我们的思路是:同时遍历两给树,遇到空树或者不相等时返回。 . - 力扣

    2024年04月12日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包