目录

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

原题链接:https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId=8&&tqId=11004&rp=2&ru=/activity/oj&qru=/ta/cracking-the-coding-interview/question-ranking

目录

[1. 题目描述](#1. 题目描述)

[2. 思路分析](#2. 思路分析)

[3. 代码实现](#3. 代码实现)


1. 题目描述

2. 思路分析

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

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

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

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

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

我们用结构体指针lheadltail分别表示值小于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

否则可能会出现环。

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

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

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

最后返回head即可

3. 代码实现

cpp 复制代码
/*
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;
    }
};
本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
明月看潮生12 分钟前
青少年编程与数学 02-016 Python数据结构与算法 03课题、数组与链表
数据结构·python·青少年编程·编程与数学
苏卫苏卫苏卫1 小时前
【Python】数据结构练习
开发语言·数据结构·笔记·python·numpy·pandas
weisian1511 小时前
力扣经典算法篇-9-跳跃游戏(贪心算法,反向递推)
算法·leetcode·游戏
辰辰大美女呀1 小时前
C 语言高级编程指南:回调函数与设计模式
c语言·开发语言·设计模式
pystraf2 小时前
P10587 「ALFR Round 2」C 小 Y 的数 Solution
数据结构·c++·算法·线段树·洛谷
_x_w2 小时前
【8】数据结构的栈与队列练习篇章
开发语言·数据结构·笔记·python·链表
努力也学不会java2 小时前
【动态规划】深入动态规划 非连续子序列问题
java·数据结构·算法·leetcode·动态规划
脱脱克克2 小时前
大厂机考——各算法与数据结构详解
数据结构·算法
梁下轻语的秋缘3 小时前
每日c/c++题 备战蓝桥杯(求解三个数的最大公约数与最小公倍数)
c语言·c++·学习·算法·蓝桥杯
Chandler243 小时前
LeetCode 热题 100 堆
算法·leetcode