【数据结构】--链表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;
}
相关推荐
Reisentyan14 小时前
[杭电春季联赛5]1004 赛马
算法
雨墨✘14 小时前
基于比较的三种排序算法:插入排序、合并排序和快排序
数据结构·算法·排序算法
故事和你9114 小时前
洛谷-数据结构1-2-二叉树1
开发语言·数据结构·c++·算法·leetcode·动态规划·图论
xu_wenming14 小时前
手写数字识别项目教程
网络·算法
_日拱一卒14 小时前
LeetCode:19删除链表的倒数第N个节点
算法·leetcode·链表
AIoT科技物语15 小时前
免费开源!50+算法,Java基于YOLO框架的视频AI识别算法平台,适配低空无人机巡检、摄像头安防场景
java·人工智能·算法·yolo·开源
ん贤15 小时前
Go GC垃圾回收机制
算法·go·gc·垃圾回收
y = xⁿ15 小时前
20天速通LeetCode day08:关于栈
算法·leetcode·职场和发展
Shadow(⊙o⊙)15 小时前
专题二滑动窗口
数据结构·算法
tankeven15 小时前
HJ181 相差不超过k的最多数
数据结构·c++·算法