【数据结构】--链表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;
}
相关推荐
剑心诀1 小时前
02 数据结构(C) | 线性表——顺序表的基本操作
c语言·开发语言·数据结构
2501_924952692 小时前
代码生成器优化策略
开发语言·c++·算法
MORE_772 小时前
leecode100-划分区间-贪心算法
算法·贪心算法
Book思议-2 小时前
【数据结构实战】C语言实现栈的链式存储:从初始化到销毁,手把手教你写可运行代码
数据结构·算法·链表··408
m0_488633322 小时前
C语言变量命名规则、入门自学、运算符优先级及数据结构介绍
c语言·数据结构·运算符优先级·变量命名·入门自学
左左右右左右摇晃2 小时前
数据结构——栈
数据结构·笔记
左左右右左右摇晃2 小时前
数据结构——树
数据结构·笔记
Book思议-2 小时前
【数据结构实战】川剧 “扯脸” 与栈的 LIFO 特性 :用 C 语言实现 3 种栈结构
c语言·数据结构·算法·
3GPP仿真实验室3 小时前
【MATLAB源码】感知:CFAR 检测算法库
算法·matlab·目标跟踪