当前位置: 首页 > article >正文

【初阶数据结构篇】单链表OJ题(上篇)

文章目录

须知

💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力!

👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!
🚀 分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步!

前言: 

 本篇文章是一篇训练题,以锻炼自己的思维为主,题目相对较简单,便于小白入门算法,接下来将跟着小编探索算法在解题中的应用。

1. 链表分割

题目链接:链表分割_牛客题霸_牛客网

题目描述:

1.1 解题思路:

思路1:

创建新链表,两次循环判断,第一次将所有小于x的节点尾插到新链表中,第二次循环将所有大于x节点的值尾插到第一次循环结束后的链表中,再返回新链表的头结点即可。

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        ListNode* pcur1=pHead;
        ListNode* pcur2=pHead;
        ListNode* newHead,*newTail=(ListNode*)malloc(sizeof(ListNode));
        //第一次循环将所有小于x的节点尾插到新链表中
        while(pcur1)
        {
            if(pcur1->val<x)
            {
                newTail->next=pcur1;
                newTail=newTail->next;
            }
            pcur1=pcur1->next;
        }
         //第二次循环将所有大于x的节点尾插到新链表中
        while(pcur2)
        {
            if(pcur2->val>=x)
            {
                newTail->next=pcur2;
                newTail=newTail->next;
            }
            pcur2=pcur2->next;
        }
        return newHead->next;
    }
};

思路2:

创建两个大小链表,再两个链表收尾相连,最后防止出现死循环。

class Partition {
  public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        ListNode* l1, * l2;
        l1 = l2 = (ListNode*)malloc(sizeof(ListNode));
        ListNode* l3, * l4;
        l3 = l4 = (ListNode*)malloc(sizeof(ListNode));
        ListNode* pcur = pHead;
        while (pcur) {
            //小链表
            if (pcur->val < x) {
                l1->next = pcur;
                l1 = l1->next;
            }
            //大链表
            else {
                l3->next = pcur;
                l3 = l3->next;
            }
            pcur=pcur->next;
        }
 
        l1->next=l4->next;
        l3->next = NULL;
         ListNode* ret=l2->next;
        free(l2);
        free(l4);
        l2=l4=NULL;
        return ret;
    }
};

2. 链表回文结构

题目链接:链表的回文结构_牛客题霸_牛客网

题目描述:

 2.1 解题思路:

思路1:

将链表中的元素放进数组中,然后使用"双指针"判断是否为回文结构

class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
        // write code here
        ListNode* pcur=A;
        int i=0,arr[901];
        //将链表中的数据存入数组中
        while(pcur)
        {
            arr[i++]=pcur->val;
            pcur=pcur->next;
        }
        int left=0,right=i-1;
        while(left<right)
        {
            if(arr[left]!=arr[right])
            {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
};

思路2:

找中间节点 ,再将中间节点后半段进行翻转,再将前半段链表与翻转后半段链表的值依次进行比较。

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class PalindromeList {
    public boolean chkPalindrome(ListNode A) {
        // 1 使用快慢指针找到链表的中间节点
        ListNode slow = A;
        ListNode fast = A;
        while(fast!=null && fast.next!=null){
            slow = slow.next;
            fast = fast.next.next;
        }

        //2 对后半段链表进行逆置操作
        ListNode reversed = reverse(slow);
        //3 比较判断回文
        while(reversed!=null && A!=null){
            if(reversed.val != A.val){
                return false;
            }else{
                reversed = reversed.next;
                A = A.next;
            }
        }
        //跳出while循环,表示比较完毕,返回是回文
        return true;
    }

    //链表翻转
    public ListNode reverse(ListNode A) {
        if(A==null) {return null;}
        ListNode n0=null;
        ListNode n1=A;
        ListNode n2=A.next;
        while(n1!=null){
            //指向翻转
            n1.next = n0;
            //指针赋值
            n0 = n1;
            n1 = n2;
            if(n2!=null){
                n2 = n2.next; //n2后移;存在最后一次n2已经为空的后移
            }

        }
        //返回n0
        return n0;
    }
}

3. 移除链表中的元素

题目链接:203. 移除链表元素 - 力扣(LeetCode)

解题思路:

Leetcode算法题(移除链表中的元素)_算法设计code删除链表中的元素-CSDN博客

4. 反转链表

题目链接:206. 反转链表 - 力扣(LeetCode)

相关解题博客链接:leetcode算法题(反转链表)-CSDN博客

5.链表的中间节点

题目链接:876. 链表的中间结点 - 力扣(LeetCode)

6.返回倒数第k个节点

题目链接:面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode)

7. 合并两个有序链表

题目链接:21. 合并两个有序链表 - 力扣(LeetCode)

Leetcode算法题(链表的中间节点+返回倒数第k个节点+合并两个有序链表)-CSDN博客

 本篇文章的算法题到此结束,如果对你学习数据结构与算法有帮助,期待你的3连

下一篇文章再会!!!


http://www.kler.cn/a/406437.html

相关文章:

  • JDBC编程---Java
  • Qt 实现网络数据报文大小端数据的收发
  • DB-GPT V0.6.2 版本更新:牵手libro社区、GraphRAG图谱构建能力增强等
  • TabNet 模型示例
  • 索引(MySQL)
  • 小蓝了解篇
  • linux下使用vscode编译及引用动态链接库
  • 基于迅为RK3568开发板全国产平台,快速实现APP开机自启动技术分享
  • 什么是ARM
  • Django如何配置多个环境的MySQL数据库
  • (微信小程序)基于Spring Boot的校园失物招领平台的设计与实现(vue3+uniapp+mysql)
  • MongoDB 更新集合名
  • 【鸿蒙】实现新闻上下轮播滚动效果-harmonyos
  • 自动驾驶车载SoC设计功能安全
  • 微软发布Win11 24H2系统11月可选更新KB5046740!
  • centos 服务器 docker 使用代理
  • 论文阅读:SIMBA: single-cell embedding along with features
  • el-table表头前几列固定,后面几列根据接口返回的值不同展示不同
  • 从复合字符串中分割并解析多个JSON字符串
  • VR虚拟现实技术的应用领域有哪些?
  • 长文解读:OSAID 1.0,全球首个开源AI标准,审视探讨其对AI行业实践开源的影响
  • React 表单Form 中的 useWatch
  • 《Vue零基础教程》(3)创建第一个应用案例
  • java使用itext生成pdf
  • shell--第一次作业
  • 微信小程序组件详解:text 和 rich-text 组件的基本用法