【数据结构】--链表OJ

一、链表分割

题目链接如下:

链表分割

这是牛客网上面的一道题目。

题目描述如下:

例如我们下面有这么一个链表:

{6、1、4、3、2}

我们传入一个3。

那么我们小于3的部分要在3的右边,要是就这个要求,那么还是很简单的。

题目中还要求不可以改变数据的原本顺序,就比如我们上面这个数组,我们的x是3,那么我们的1和2要在前面,然后我们的1原来的顺序也是在2的前面的,那么我们弄好后,1还是要保持在2的前面。还有大于等于3的,其弄好后的顺序也应该为6、4、3。

解题思路:

我们可以创建两个链表,一个链表存放的是小于传入的x的,一个是存放大于等于x的。

代码如下:

复制代码
#include <cstdlib>
class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        ListNode*lessHead=(ListNode*)malloc(sizeof(ListNode));
        ListNode*largerHead=(ListNode*)malloc(sizeof(ListNode));
        ListNode*prue=pHead;
        ListNode*lesscur=lessHead;
        ListNode*largercur=largerHead;
        while (prue) 
        {
             if(prue->val<x)
             {
                lesscur->next=prue;
                lesscur=lesscur->next;
             }
             else {
             largercur->next=prue;
             largercur=largercur->next;
             }
             prue=prue->next;
        }
        lesscur->next=largerHead->next;
        largercur->next=nullptr;
        ListNode*ppHead=lessHead->next;
        free(lessHead);
        free(largerHead);
        return ppHead;
    }
};

首先就是在对于大小链表的尾插的时候,不要忘记链表指针往后挪动一个位置,然后就是在完成对两个链表进行合并的时候,我们的大链表的尾结点要记得指向空,不然在链表的遍历的时候会造成死循环。

二、随机链表的复制

题目链接:
随机链表复制

这个题目是力扣上的一道中等题。

题目如下:

其链表大概如下图所示:

其结点的结构相较于我们单链表结点的结构,还多了一个rondom指针,而且这个指针的指向是没有规律的,所以对于这个链表的复制的难点在于对于rondom的处理。

这里我们直接讲解题方法:

首先我们创建一个指针遍历链表,然后每遍历一次就对这个节点进行复制,然后呢这个复制好的节点我们将其链接到原来节点的next指针中,然后复制好的节点的next指向原来节点的next指针。

然后复制好后,其结构大概如下所示:

我们来看看copy后13的这个节点的rondom的指针如何操作,我们会很巧妙的发现,copy的rondom就是原来节点的rondom的指针指向的那个节点的next指针。

那么代码如下:

复制代码
 typedef struct Node Node;
//申请节点函数
Node*Buynode(int x){
    Node*newnode=(Node*)malloc(sizeof(Node));
    newnode->val=x;
    newnode->next=NULL;
    newnode->random=NULL;
    return newnode;
}
//复制链表的节点,尾插在原节点末尾
void AddNode(Node*head){
    Node*pur=head;
    while(pur){
        Node*next=pur->next;
        Node*newnode=Buynode(pur->val);
        pur->next=newnode;
        newnode->next=next;

        pur=next;
    }
}
//处理rondom
void SetRandom(Node*head){
    Node*pur=head;
    
    while(pur){
    Node*copy=pur->next;
    if(pur->random){
        copy->random=pur->random->next;
    }
    pur=copy->next;
    }
}
struct Node* copyRandomList(struct Node* head) {
    if(head==NULL){
     return head;
    }
	//先拷贝节点
    AddNode(head);
    //处理rondom
    SetRandom(head);
    //将原链表和拷贝的链表进行断开
    Node*pur=head;
    Node*newnode=head->next;
    Node*newTils=newnode;
    while(newTils->next){
        pur=newTils->next;
        newTils->next=pur->next;
        newTils=newTils->next;
    }
    return newnode;
}
相关推荐
迷途之人不知返22 分钟前
算法系列5:位运算
算法
牢姐与蒯26 分钟前
c++加餐之位图
c++·算法·哈希
Omics Pro39 分钟前
预测性虚拟细胞中显式机理算子
大数据·数据库·人工智能·python·算法·机器学习·自然语言处理
驭渊的小故事41 分钟前
算法实战:滑动窗口、素数枚举与字符串模拟(三道经典题解)
java·算法
牢姐与蒯1 小时前
位运算及其oj题
c++·算法
Logic1013 小时前
C语言/数据结构字符串题解:按字符类型重排(数字→字母→符号)——三趟扫描稳定分区
c语言·数据结构·字符串·时间复杂度·计数排序·算法题·ascii
Logic1019 小时前
C语言/数据结构位运算题解:异或XOR找出学习计划中的“独特学习时间“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
小蒋学算法10 小时前
算法-交替删除操作后最后剩下的整数-跟着灵茶山艾府学算法
数据结构·算法
荆棘鸟智能10 小时前
林业遥感长势评估怎么做?从NDVI时序分析到LiDAR蓄积量回归
人工智能·算法·智慧林业
hhb_61811 小时前
AIRAGDebug:一键定位RAG链路异常
人工智能·python·算法