【数据结构OJ题】链表分割

简介: 牛客题目——链表分割

1. 题目描述

c5f19d4e5793aa7d5a1bff80b71e08af.png

2. 思路分析

整体思路:创建两个链表,分别存放小于x的结点和大于等于x的结点,分别进行尾插
9472eaffc1b4c3c1d5cb82563395be9e.png

这道题目使用哨兵位会更简单,原因如下(能避开很多为空的情况):

(1)使用哨兵位就不需要考虑两个链表尾插时为空的情况。

(2)两个链表链接时也不需要考虑是否为空的情况。

(3)哪怕有一个链表为空,也有哨兵位的头结点,正常链接即可。
af828cb509c72ac24a1d5056eafff16f.png

我们用结构体指针lhead和ltail分别表示值小于x的那一条链表,用结构体指针gheadgtail表示值大于等于x的那一条链表

用malloc()函数分别申请两个结点,也就是两个链表的哨兵位,让lhead和ltail一开始指向其中一个,ghead和gtail一开始指向另一个。

再创建一个结构体指针cur用来遍历原链表,我们采用了while循环,当cur不为空时遍历结点。

结点的值小于x时,我们将这个结点尾插到第一个链表(ltail->next=cur)。再让ltai往后走一步(ltai=ltail->next)。

结点的值大于等于x时,我们将结点尾插到第二个链表(gtail->next=cur)。再让gtail往后走一 一步(gtail=gtail->next)。

尾插一个结点后,让cur往后走一步cur=cur->next)。当cur为空时停止循环。

然后将两个链表链接起来。(ltail->next=ghead->next)。

有一点需要非常注意!!!

将gtail->next=NULL

否则可能会出现环。
b7c8d47e262fb15674f0a6a00f677e48.png

因为现在lhead指向的是哨兵位,所以我们要将lhead往后走一步lhead=lhead->next)。

因为怕找不到lhead的下一个位置,所以我们引入一个结构体指针head保存lhead的下一个位置。(struct ListNode *head=lhead->next)。

然后为了防止内存泄漏,我们要用free()释放掉两个哨兵位(即free(lhed)和free(ghead))。

最后返回head即可
82dcec95d896f032373c8f19dabfb833.png

3. 代码实现

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
   
public:
    ListNode* partition(ListNode* pHead, int x) {
   
    struct ListNode *lhead,*ltail,*ghead,*gtail;
    lhead=ltail=(struct ListNode*)malloc(sizeof(struct ListNode));
    ghead=gtail=(struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode *cur=pHead;
    while(cur)
    {
   
        if(cur->val<x)
        {
   
            ltail->next=cur;
            ltail=ltail->next;
        }
        else
        {
   
            gtail->next=cur;
            gtail=gtail->next;
        }
        cur=cur->next;
    }
    ltail->next=ghead->next;
    //不空,可能导致出现环
    gtail->next=NULL;
    struct ListNode *head=lhead->next;
    free(lhead);
    free(ghead);
    return head;
    }
};

eb1ea53d55be3cb0b302654ee885ed9e.png

相关文章
|
4天前
|
存储 C语言
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
|
11天前
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
21 4
|
1月前
|
存储 索引
【数据结构OJ题】设计循环队列
力扣题目——设计循环队列
23 1
【数据结构OJ题】设计循环队列
|
3天前
|
算法
【数据结构与算法】共享双向链表
【数据结构与算法】共享双向链表
4 0
|
3天前
|
算法
【数据结构与算法】双向链表
【数据结构与算法】双向链表
4 0
|
3天前
|
算法
【数据结构与算法】循环链表
【数据结构与算法】循环链表
4 0
|
3天前
|
存储 算法
【数据结构与算法】链表
【数据结构与算法】链表
4 0
|
6天前
|
存储 缓存
【数据结构】——顺序表与链表
【数据结构】——顺序表与链表
|
1月前
【数据结构OJ题】用栈实现队列
力扣题目——用栈实现队列
27 0
【数据结构OJ题】用栈实现队列
|
1月前
【数据结构OJ题】用队列实现栈
力扣题目——用队列实现栈
30 0
【数据结构OJ题】用队列实现栈