一、链表分割
题目链接如下:
这是牛客网上面的一道题目。
题目描述如下:

例如我们下面有这么一个链表:
{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;
}